Abstract

XX

Introduction

XX

In this paper, we first introduce a child-friendly version of Weisman et al.’s (2017) experimental paradigm, validate it among US adults, and then use this paradigm to conduct an initial exploration of this conceptual structure and mental capacity attributions among US children, focusing on 7- to 9-year-old children (Study 1). Next, we replicate our findings with 7- to 9-year-old children using a briefer experimental paradigm, and use this briefer paradigm to assess the earlier development of this conceptual structure, focusing on 4- to 6-year-old children (Study 2). We then develop an even simpler version of the paradigm, using more basic vocabulary and a streamlined experimental protocol, with the aim of validating and refining our understanding of conceptual structure among 4- to 6-year-old children, as well as exploring how younger children’s attributions of different aspects of mental life might vary with age (Study 3). Finally, to supplement the group-level analyses picture of development provided by the exploratory factor analyses for Studies 1-3, we re-analyze these data using a novel, participant-level approach that allows us to observe how these conceptual structures might evolve and unfold continuously over development (“Continuous development at the participant level: A re-analysis of Studies 1-3”).

Overview of Methods and Analyses

Studies 1-3 used very similar experimental paradigms and were designed with the same analyses in mind. Here we provide an overview of the methods and planned analyses for all of these studies; any details that varied across studies are supplied in the “Methods” section of each of the studies.

General methods

Following Weisman et al. (2017), these studies were designed with the goal of focusing participants’ attention on the similarities, differences, and relationships among various mental capacities.

To this end, each participant was either randomly or pseudo-randomly assigned to assess 1-2 target characters (e.g., a beetle, a robot, a goat, etc.) on a wide range of sensory, perceptual, emotional, social, cognitive, and other mental capacities, ranging in number from 18-40 across studies and presented in either a random or a pseudo-random (counterbalanced) order. Participants were presented with a vivid, full-color photograph of their assigned target in a naturalistic context (e.g., a beetle on a leaf; a robot in an office; a goat in a grassy field), which they had access to throughout the study.

On each trial, participants were asked a question of the form Do you think a [target] can [do X]? (e.g., “Do you think a beetle can feel happy?”; Studies 1-2) or Can [targets] [do X]? (Study 3) (e.g., “Can beetles feel happy?”). Participants responded on a three-point scale (no, coded as 0; kinda, coded as 0.5; or yes, coded as 1). Although a three-point scale is not optimal for factor analyses, pilot testing suggested that it was critical in allowing children to move fast enough through the study to answer all questions, and maintaining this within-subjects design was our top priority for the planned analyses.

See the Methods section for each study for details of the particular target characters and mental capacities included in each study, as well as the materials and physical setup.

Primary analysis: Exploratory factor analysis (EFA)

Our primary goal in conducting these studies was to uncover a set of latent constructs that might plausibly have given rise to the observed correlations among mental capacity attributions in each group of participants. As such, our primary planned analysis for all studies was an exploratory factor analysis (EFA). Following Weisman et al. (2017), we interpreted each of the constructs (“factors”) as corresponding to a fundamental component of mental life, according to this group of participants; by extension, we consider the full set of factors for each sample to represent to the overall “conceptual structure” underlying mental capacity attributions for this group of participants.

For all EFAs, we used ordinary least squares to find the minimum residual solution, using the “psych” package for R (Revelle, 2018). Here we focus on results using Pearson correlations using pairwise complete observations. (See Online Supplementary Materials [OSM] for solutions using polychoric correlations, which are better suited to handle responses on a three-point scale but, to our eyes, tended to over-fit our data by suggesting that we should retain many factors that each accounted for only a small amount of the shared variance.)

In order to determine how many factors to retain, we examined the results of three factor retention protocols: (1) Parallel Analysis, which compares the observed correlation structure to the correlation structure arising from random datasets of the same size; (2) Minimizing the Bayesian Information Criterion (BIC), which is one method of optimizing both goodness of fit and parsimony; and (3) A set of factor retention criteria that have been used in Weisman et al.’s (2017) previous work, in which they began with the maximal number of factors according to an analysis of degrees of freedom, and retained factors that met all three of the following criteria: (a) had eigenvalues greater than 1.00, (b) individually accounted for greater than 5% of the shared variance before rotation, and (c) were the “dominant” factor (the factor with the strongest absolute factor loading) for at least 1 mental capacity after rotation. For each study, our interpretation of how best to characterize the dataset (i.e., how many factors we observe) was determined by the degree of consensus among these three protocols and the interpretability of the retained factors under each protocol.

Here we focus our interpretations on varimax-rotated solutions, which constrain all factors to be orthogonal. (See OSM for solutions using oblique [“oblimin”] rotations, which allow for correlated factors.)

Secondary analysis: Regression analyses of factor scores

Having inferred a conceptual structure for a given group of participants via EFA, we then sought to examine attributions of mental capacities to the particular target characters included in each study within this conceptual structure: To what extent did participants attribute each of the fundamental components of mental life revealed by EFA to a given target character, and how did this attributions vary with age (either within an age group or between age groups)? To explore this question, we examined “factor scores”—summaries of each participant’s attributions of each of factors revealed by EFA. We used the correlation-preserving “ten Berge” method (as implemented in the “psych” package; Revelle, 2018), imputing missing values using the mean (by target character, capacity, and age group). This yielded one factor score for each of the factors revealed by EFA for each participant.

We analyzed these factor scores via mixed effects Bayesian regression analyses using the “brms” package for R (Bürkner, 2017). In all of these analyses, we included the maximal random effect structures given the design for the relevant study. Further details varied by study, depending on the number of target characters included in that study, the number of factors revealed by EFA for the relevant group(s) of participants, and the goals of the analysis (e.g., comparing two age groups vs. examining continuous effects of age within one or more groups of participants).

Study 1

The goal of Study 1 was to develop a child-friendly version of Weisman et al.’s (2017) study paradigm and conduct an initial exploration of this conceptual structure among children.

Pilot testing suggested that children as young as 7 years of age found the paradigm easy and enjoyable, and work on the development of lay biology and psychology has suggested that these concepts may continue to develop well into middle childhood (e.g., Carey, 1985; Hatano & Inagaki, 1997; Piaget, 1929; cf. Gelman & Opfer, 2002). Thus, we targeted 7- to 9-year-old children for our first child sample. We also recruited a group of adults to validate our child- friendly paradigm, i.e., to evaluate whether it replicated Weisman et al.’s (2017) original work with adults. In Weisman et al.’s (2017) original studies, participants evaluated a target character on 40 mental capacities using a seven-point Likert-type scale. Pilot testing suggested two necessary modifications for children: rewording some of the mental capacity items, and using a simpler, three-point response scale (no, kinda, or yes; see “Overview of Methods and Analyses, above”).

Method

Participants

400 people participated in this study.

Adults (n=200) participated via Amazon Mechanical Turk (MTurk) in July 2016. Adult participants had gained approval for at least 95% of their previous work on MTurk; had MTurk accounts based in the US; and indicated that they were at least 18 years old. Adults were paid $0.30 for approximately 2-3 minutes of their time (median duration: 2.48 min).

According to self report, the adult sample ranged in age from 18-65 years (median: 31y) and was roughly split between women (47%) and men (52%; 1% of participants identified as some other gender or opted not to disclose). Adults predominantly identified as White (81%; 8% identified as more than one race/ethnicity, and \(\leq\) 4% as any other race/ethnicity). The vast majority of adults reported English being their only native language (91%; an additional 7% indicated that English was one of multiple native languages for them.)

Children (n=200) participated at one of several San Francisco Bay Area museums or at their younger sibling’s preschool between July-December 2016. The study took most children under 10 minutes to complete (median duration: 5.18 min). An additional 12 children participated but were excluded for being outside the target age range (n=7), being of unknown age (n=4), or being shown a target character other than a beetle or a robot (n=1). Children received a small thank-you gift (e.g., a sticker) for their participation.

Children ranged in age from 7.01-9.99 years (median: 8.31y). According to parental report, the child sample included slightly more girls (56%) than boys (42%; 2% of children’s gender was non-binary or unknown). Parents predominantly identified their children as White (32%), multiracial (12%), East Asian (12%), or South Asian (10%; \(\leq\) 8% of children were identified as any other race/ethnicity, and 22% of children’s race/ethnicity was unknown). Roughly half of parents (46%) reported that their child was bilingual (though, anecdotally, parents’ interpretations of “bilingual” ranged from taking classes at school to speaking a langauge at home).

Materials and procedure

Following Weisman et al. (2017, Studies 1-3), participants were randomly assigned to assess the mental capacities of one of two “edge cases” in social reasoning: a beetle (n=98 adults, n=104 children) or a robot (n=102 adults, n=96 children). Because beetles are animals and robots are artifacts, this pair provides insight into the role of biological life in attributions of mental life—an issue of particular interest from a developmental perspective, given the long history of work on the development of the animate-inanimate distinction and its relation to folk psychology. Most critically for our bottom-up approach to uncovering conceptual structure, the “mental lives” of these entities are controversial: People differ in their assessments of the mental capacities of beetles and robots. This allowed us to address the following question: When participants disagree about the mental capacities of some entity, which capacities “go together”?

Instructions to participants focused on the idea that we wanted to know what participants thought “[beetles/robots] can do and can not do.” Participants rated the target character on 40 mental capacities, presented in a random order for each participant. On each trial, participants responded no, kinda, or yes to the question “Do you think a [beetle/robot] can…?” The three response options were visible throughout the experiment.

The 40 mental capacities were designed to be as close as possible to those in Weisman et al.’s (2017) original studies, while being comprehensible to children in early elementary school. This set of items included physiological sensations related to biological needs (e.g., get hungry); emotional experiences (e.g., feel happy); perceptual abilities (e.g., hear sounds); cognitive abilities (e.g., remember things); capacities related to autonomy or agency (e.g., decide what to do); social abilities (e.g., feel guilty); and several additional items (e.g., be aware of itself). Each of these a priori categories included at least five items of varying valence, complexity, and phrasing. (See Figure 1 for the full list of mental capacities included in Study 1.)

We also prepared a short definition for each item, so as to be consistent in our responses to participants (particularly children) if they asked for clarification (see SOM). Children were encouraged at the beginning of the study to ask questions if they did not know what a word meant, in which case they given these definitions; adults were told that they could access these definitions by hovering over the text on the computer screen. Pilot testing suggested that seven items required clarification for most children, so these items were always accompanied by their definitions from the beginning of the trial (for both adults and children), as follows: have a personality, like when someone is shy and somebody else is silly; have beliefs, like when you think something is true; feel pleasure, like when something feels really good; have desires, like when you really want something; have self- control, like when you stop yourself from doing something you shouldn’t do; have goals, like when you’re trying hard to do something or make something happen; and feel sick, like when you feel like you might throw up.

Adults completed the study by clicking through a website at their own pace, with one trial presented on each page and no ability to go backwards. Children completed the study on an experimenter’s laptop computer. The experimenter read the instructions and the first several trials out loud, requesting verbal responses from the child and selected his or her response for her; after several trials, the experimenter gave the child the option to continue independently (reading the questions and selecting their answers themselves) if they desired. Roughly half of participants completed the remainder of the task independently.

Data processing

We dropped trials with response times that were faster than a preset criterion of 250ms (n=3 child trials, n=97 adult trials) and retained participants regardless of skipped trials (n=55 child trials, n=1 adult trial). Overall, only 1% of adult trials and 1% of child trials were missing data; in these cases, we imputed missing values using the median by target character, capacity, and age group.

Results

Conceptual structure: Adults

Two of our three methods for determining how many factors to retain (minimizing BIC and Weisman et al.’s factor retention criteria) suggested retaining three factors. (Parallel analysis suggested retaining four factors. Three of these factors were very similar to the three factors reported below, and the fourth factor was dominant for a handful of sensory and perceptual capacities, including hear sounds, sense temperatures, see things, and sense whether something is close by or far away; see SOM.)

After rotation, the first factor corresponded primarily to capacities for self- and other-relevant emotions—a suite of capacities that we (following Weisman et al.) will refer to as HEART. It was the dominant factor for such items as feel proud, feel joy, feel sad, and feel happy, and accounted for 37% of the shared variance in the rotated three-factor solution.

The second factor corresponded primarily to physiological sensations related to biological needs—a suite of capacities that we (following Weisman et al.) will refer to as BODY. It was the dominant factor for such items as get hungry, feel pain, feel scared, and feel tired, and accounted for 37% of the shared variance in the rotated three-factor solution.

The third factor corresponded primarily to perceptual-cognitive abilities to detect and use information about the environment—a suite of capacities that we (following Weisman et al.) will refer to as MIND. It was the dominant factor for such items as figure out how to do things, make choices, recognize somebody else, and sense whether something is close by or far away, and accounted for 25% of the shared variance in the rotated three-factor solution.

See Figure 1 for all factor loadings. (Note that for the sake of consistency across studies and comparison with Weisman et al.’s work, we have plotted these factors in the same order for all studies: BODY, HEART, and MIND.)

In sum, as Weisman et al.‘s original studies, a three-factor structure emerged from adults’ mental capacity attributions, characterized by a distinction between body, heart, and mind. This suggests that our child-friendly paradigm was valid: Using reworded items and a three-point response scale elicited the same intuitive ontology of mental life, among adults, that has been revealed by more complex, “adult-friendly” experimental paradigms.

Conceptual structure: Children (7-9y)

Our three methods for determining how many factors to retain all suggested retaining three factors.

After rotation, the first factor corresponded primarily to social-emotional abilities. An analysis of factor congruence confirmed that this factor was most similar to adults’ HEART factor (cosine similarity with HEART: 0.97; with BODY: 0.41; with MIND: 0.43). It was the dominant factor for such items as feel proud, feel happy, feel joy, and get hurt feelings, and accounted for 50% of the shared variance in the rotated three-factor solution.

The second factor corresponded primarily to physiological sensations. An analysis of factor congruence confirmed that this factor was most similar to adults’ BODY factor (cosine similarity with BODY: 0.91; with HEART: 0.26; with MIND: 0.03). It was the dominant factor for such items as get hungry, feel pain, smell things, and feel scared, and accounted for 30% of the shared variance in the rotated three-factor solution.

The third factor corresponded primarily to perceptual-cognitive abilities. An analysis of factor congruence confirmed that this factor was most similar to adults’ MIND factor (cosine similarity with MIND: 0.94; with HEART: 0.35; with BODY: 0.01). It was the dominant factor for such items as be aware of itself, be aware of things, figure out how to do things, and sense whether something is close by or far away, and accounted for 20% of the shared variance in the rotated three-factor solution. (See Figure 1 for all factor loadings.)

In sum, like adults, children’s mental capacity attributions were dominated by a three-way distinction between physiological, social-emotional, and perceptual-cognitive abilities—i.e., body, heart, and mind.

Attributions of mental life

The factor analyses of correlations among mental capacity attributions just described shed light on one aspect of children’s concepts of mental life: its ontological structure. The design of our study also allows us to look at a second aspect of conceptual development in this domain: children’s application of this concept, i.e., which mental capacities they tend to attribute or not to attribute to the different target characters. How might children’s attributions of capacities related to BODY, HEART, and MIND vary across middle childhood (7-9y), and how do they compare to the mental capacity attributions of adults?

Children vs. adults

To compare children’s mental capacity attributions to those of adults, we projected children’s responses into the factor space defined by adults (standardized in terms of adults’ responses), and examined factor scores by age group (using the correlation-preserving method articulated by ten Berge, Krijnen, Wansbeek, & Shapiro, 1999, as implemented in the “psych” package for R, Revelle, 2018). This yielded three scores for each participant, corresponding, in principle, to holistic judgments of the social-emotional, physiological, and perceptual-cognitive abilities of the target character the participant evaluated. (Note that each of these three scores takes into account factor loadings for all 40 mental capacities, as shown in Figure 1.)

This allowed us to examine the effects of age group (adult, child), character (beetle, robot), and factor (BODY, HEART, MIND) on these scores via mixed effects Bayesian regression. See Table 1 for the results of a maximal model and Figure 4 for scores by age group, age (for children), factor, and character.

Table 1: Fixed effects from a mixed-effects Bayesian regression model predicting factor scores in Study 1 by character (beetle, robot), factor (BODY, HEART, MIND), and age group (adults, children). The model used the formula 'factor score ~ factor * age group * character + (1 | subject)' and was implemented in the 'brms' package for R (Bürkner, 2017). Factor and character were effect-coded; age group was dummy-coded with adults as the baseline. Asterisks mark parameters whose 95% credible interval does not include 0.
Parameter b Error 95% CI
Adults
(Intercept) 0.00 0.04 [-0.07, 0.08]
character (robot vs. grand mean) -0.25 0.04 [-0.33, -0.17] *
HEART (vs. grand mean) -0.01 0.06 [-0.11, 0.10]
MIND (vs. grand mean) -0.01 0.06 [-0.12, 0.10]
character × HEART 0.26 0.06 [ 0.15, 0.37] *
character × MIND 0.42 0.06 [ 0.31, 0.53] *
7-9y vs. adults
age group (children vs. adults) 0.60 0.06 [ 0.49, 0.70] *
character × age group 0.09 0.06 [-0.02, 0.20]
HEART × age group 1.64 0.08 [ 1.48, 1.78] *
MIND × age group -1.10 0.08 [-1.26, -0.94] *
character × HEART × age group -0.03 0.08 [-0.19, 0.12]
character × MIND × age group -0.07 0.08 [-0.22, 0.08]

Collapsing across factors, factor scores suggest that adults generally attributed fewer mental capacities to the robot than the beetle (b = -0.25, 95% credible interval: [-0.33, -0.17]). However, this appears to be entirely due to the huge discrepancy between characters in the BODY domain; the difference between characters was reduced to nothing in the HEART domain (b = 0.26, 95% credible interval: [0.15, 0.37]), and reversed in the perceptual-cognitive domain (b = 0.42, 95% credible interval: [0.31, 0.53]).

Meanwhile, children children tended to attribute more mental capacities, collapsing across characters, than did adults (b = 0.60, 95% credible interval: [0.49, 0.70]) - but this was driven primarily by the social-emotional domain (b = 1.64, 95% credible interval: [1.48, 1.78]), and was reversed in the perceptual-cognitive domain (b = -1.10, 95% credible interval: [-1.26, -0.94]).

A visual inspection of Figure 2 clarifies these findings. Attributions in the BODY and MIND domains were rather similar for children and adults: Both children and adults marked a clear difference between the robot and the beetle in the physiological sensations of the BODY (top row), in line with the animate–inanimate distinction; and both age groups credited the robot with slightly greater perceptual-cognitive skills (MIND) than the beetle (bottom row). In contrast, in the HEART domain (middle row) both the beetle and the robot received rather low scores among adults, but very high scores among children.

The raw data further supporst these observations; see Figure 3 for raw counts of no, kinda, and yes responses for all items, grouped by factor, character, and age group. For example, consider hunger (the first capacity under BODY): Across age groups, nearly every participant said that a beetle could get hungry, while few participants (with the exception of some children) said that a robot could. Likewise, for mathematical computations (the last capacity under MIND), virtually no participants said that a beetle was capable of doing math, while the vast majority of both adults and children said that a robot was. But for social-emotional abilities, like feeling proud, feeling joy, and feeling sad (the first three capacities under HEART), far more children than adults endorsed these capacities for beetles and robots. (See SOM for an analysis, parallel to the regression analyses here, of the proportion of the top-loading mental capacities for each factor that were endorsed by participants of different ages.)

Age differences within the child sample

Of course, our sample of “children” included participants as young as 7 years and up to nearly 10 years of age. How did attributions vary across this age range?

To explore age-related differences continuously within the child sample, we conducted an additional regression analysis on children’s factor scores alone, including interactions with exact age in years (centered at the mean: 8.35y) rather than age group. In line with the age group analysis described in the previous section, this confirmed that, relative to the grand mean, attributions of HEART decreased with age (b = -0.41, 95% credible interval: [-0.56, -0.27]) and attributions of MIND increased with age (b = 0.35, 95% credible interval: [0.21, 0.50]). (See Table 2 for the full results of this model.)

Table 2: Fixed effects from a mixed-effects Bayesian regression model of children's responses, predicting factor scores in Study 1 by character (beetle, robot), factor (BODY, HEART, MIND), and exact age. The model used the formula 'factor score ~ factor * age * character + (1 | subject)' and was implemented in the 'brms' package for R (Bürkner, 2017). Factor and character were effect-coded, and age was mean-centered. Asterisks mark parameters whose 95% credible interval does not include 0.
Parameter b Error 95% CI
Collapsing across age
(Intercept) 0.60 0.04 [ 0.51, 0.69] *
character (robot vs. grand mean) -0.16 0.04 [-0.25, -0.08] *
HEART (vs. grand mean) 1.63 0.06 [ 1.50, 1.75] *
MIND (vs. grand mean) -1.10 0.06 [-1.22, -0.98] *
character × HEART 0.21 0.06 [ 0.09, 0.33] *
character × MIND 0.35 0.06 [ 0.23, 0.47] *
Age effects
age (mean-centered) -0.08 0.05 [-0.18, 0.03]
character × age -0.09 0.05 [-0.20, 0.01]
HEART × age -0.41 0.08 [-0.56, -0.27] *
MIND × age 0.35 0.07 [ 0.21, 0.50] *
character × HEART × age -0.08 0.07 [-0.23, 0.06]
character × MIND × age 0.06 0.08 [-0.09, 0.21]

Indeed, visual inspection of Figure 4 suggests that, across all three domains (BODY, HEART, and MIND), children’s mental capacity attributions to beetles and robots appeared to become more adult-like with age—but while the oldest children were indistinguishable from adults in the BODY and MIND domains, even the oldest children appear to have attributed more social-emotional abilities to these entities than most adults did.

Taken together, these analyses converge to suggest only minor differences between children and adults in their attributions of BODY and MIND to beetles and robots—but a major difference in HEART: Relative to adults, children tended to credit both beetles and robots with much greater social-emotional abilities.

Discussion

Study 1 shed light on two distinct aspects of the development of children’s concpetual representations of mental life: continuity in the underlying conceptual structure and variabilty in the application of these concepts.

Conceptual structure is adultlike at 7-9y

On the one hand, exploratory factor analyses suggested that by midddle childhood (7-9y), the conceptual structure underlying US children’s attributions of mental life is very similar to that of US adults, anchored by suites of mental capacities related to BODY (physiological sensations), HEART (social-emotional abilities), and MIND (perceptual-cognitive abilities). We note that, in principle, a number of additional or alternative latent factors could have emerged from the factor analysis of children’s responses. For example, children might have distinguished primarily between internal experience and external action (Gray et al., 2007), or they might have demonstrated finer-grained groupings of mental capacities based on phrasing, rote knowledge, etc. Instead, the latent conceptual structure underlying children’s responses appears to be very similar to that of adults, both in this study and in Weisman et al.’s (2017) previous work. In other words, any dramatic developmental changes to this conceptual structure likely occur prior to the age of 7 years.

Attributions of HEART undergo dramatic development extending well into middle childhood

On the other hand, analyses of children’s attributions within this shared conceptual structure suggested that their application of this concept—in particular, their attributions of the social-emotional abilities of the HEART—may be undergoing substantial refinement through middle childhood. The specificity of this age difference—which emerged dramatically in one domain (HEART), but not others (BODY, MIND)—suggests that this is unlikely to be due either to a general tendency toward “mentalizing” these characters (or a simple “yes” bias). But its extension to both beetles and robots raises many questions. With regard to robots, children growing up in the 21st century might be converging on a new understanding of technological “beings” as inanimate objects with some degree of social-emotional life (see Kahn, Gary, & Shen, 2013)—but this kind of historical conceptual change would not predict the high rates of social-emotional attributions to beetles that we observed. Our findings are perhaps more consistent with a general openness to untraditional social partners that extends into middle childhood (but not adulthood)—or with a difference in construals of what it means to feel proud, happy, guilty, etc. To what kinds of entities would children of this age deny social-emotional abilities, and how do they draw this line? How would younger children’s attributions of HEART (as well as BODY and MIND) compare?

Study 2

The goals of Study 2 were threefold.

First, we aimed to extend our findings with 7- to 9-year-old children in Study 1, by expanding the list of the target characters to include not only the two “edge cases” from Study 1 (a beetle and a robot), but a also a wider range of animate beings (a bird, a goat, and an elephant) and inanimate objects (a computer, a teddy bear, and a doll). In contrast to Study 1, where we tracked which mental capacities “hang together” when participants reasoned about controversial “edge cases” in social reasoning, Study 2 allowed us to track which mental capacities “hang together” when target characters are perceived to vary in their mental capacity profiles. In Weisman et al.’s original studies, this approach yielded a highly similar conceptual structure to the “edge case” approach (Weisman et al., 2017; Study 4). We reasoned that if this three-part conceptual structure is stable and robust by the age of 7-9 years, it should manifest among 7- to 9-year-old children under the same range of conditions that it does among adults.

Our second goal was to assess the earlier development of conceptual structure in a group of younger children. We targeted 4- to 6-year-old children for our younger age group because this has been identified as a period of dramatic development in several relevant domains. Many studies have documented shifts in children’s abilities to take others’ perspectives, represent false beliefs, and integrate representations of intentions and outcomes in evaluating moral responsibility (for reveiws, see Flavell, 1999; Wellman, 2015). The preschool years have also been the focus of a rich tradition of work on lay biology and the animate-inanimate distinction extending back nearly a century (e.g., Carey, 1985; R. Gelman, Spelke, & Meck, 1983; Medin, Waxman, Woodring, & Washinawatok, 2010; Piaget, 1929; for a review, see S. Gelman & Opfer, 2002). All of these accounts make the case that becoming a sophisticated reasoner—and particularly a sophisticated social reasoner—requires substantial refinement of one’s representations of others’ experiences, beliefs, desires, and needs. Might these refinements include changes to the structure of children’s concepts of mental life?

Our third goal was to examine age-related changes in which mental capacities tend to be attributed to which target characters. In summarizing the results of Study 1, we discussed mental capacity attributions as the “application” of concepts of mental life, in contrast to the conceptual “structure” revealed by exploratory factor analysis. By expanding the range of target characters included in the study, Study 2 provides an opportunity to explore changes in how children apply their developing concepts of mental life to a variety of animate beings and inanimate objects.

Method

Participants

365 people participated in this study, including a group of adults, a group of “older” children (7-9y), and a group of “younger” children (4-6y).

Adults (n=116) participated via MTurk in September 2018. Adult participants had gained approval for at least 95% of their previous work on MTurk; had MTurk accounts based in the US; and indicated that they were at least 18 years old. Adults were paid $0.45 for approximately 2-4 minutes of their time (median duration: 3.02 min). An additional 22 adults participated but were excluded for failing to respond sensibly to an open-ended question about what they had been asked to do in the study (e.g., copying and pasting text from the question, writing “good study,” or describing a different study, e.g., “I wrote an essay about nature”; n=11) or for failing to pass one or more attention checks (e.g., “Please select no”; n=11). According to self report, the final adult sample ranged in age from 20-69 years (median: 38y) and included slightly more men (53%) than women (47%). Adults predominantly identified as White (84%; 2% identified as more than one race/ethnicity, and \(\leq\) 4% as any other race/ethnicity).

We recruited two groups of children: “older” children (7-9y) and “younger” children (4-6y). Our planned sample size was 120 per age group, but we also retained a handful of extra participants who completed the study on the final day of data collection for each group.

The group that we will refer to as “older children” (n=125) ranged in age from 7.08-9.98 years (median: 8.56y), and participated at one of several San Francisco Bay Area museums or at their younger sibling’s preschool between July-December 2016. The study took most older children under 4 minutes to complete (median duration: 2.70 min). According to parental report, the sample of older children included slightly more boys (54%) than girls (45%); 1% of children’s gender was non-binary or unknown). Parents predominantly identified their children as White (30%), South Asian (14%), multiracial (11%), or East Asian (10%); \(\leq\) 7% of children were identified as any other race/ethnicity, and 22% of children’s parents declined to provide information on their race/ethnicity).

“Younger children” (n=124) ranged in age from 4.00-6.98 years (median: 5.03y), and participated either at a university-affiliated preschool or at a Bay Area museum between January-June 2017. The study took most younger children under 6 minutes to complete (median duration: 3.58 min). According to parental report and school records, the sample of younger children included roughly the same number of girls (48%) and boys (52%). Children were predominantly identified as multiracial (46%) or White (28%; \(\leq\) 6% of children were identified as any other race/ethnicity, and 5% of children’s parents declined to provide information on their race/ethnicity).

An additional 7 children participated but were excluded for being outside the target age ranges. At museums (but not at the preschool), children received a small thank-you gift (e.g., a sticker) for their participation.

Materials and procedure

Pilot testing suggested that working with younger children would require making a briefer experimental paradigm with fewer than the 40 questions included in Study 1; limiting the list to 20 questions seemed to allow children as young as 4 years of age to complete the study easily and without getting bored or frustrated, while still including enough items to enable us to proceed with our exploratory “dimensionality reduction” approach to uncovering conceptual structure.

Participants were assigned to evaluate one of the following target characters: an elephant, a goat, a mouse, a bird, a beetle, a teddy bear, a doll, a robot, or a computer (n per characater: 6-18 adults, 10-17 older children, and 12-16 younger children; see Figure 6 for exact counts).

Participants were assigned to target characters randomly, with two exceptions: (1) The doll and teddy bear conditions were run last for older children (but included in the initial randomization scheme for adults and younger children); and (2) Toward the end of data collection with children, children were assigned to conditions that had the fewest participants. (This was not possible with adults, which is why the number of adults per condition was more variable than the number of children per condition.) As in Study 1, a vivid, high-resolution photo of the target character in a naturalistic context was visible for the duration of the study.

Instructions and procedure were identical to Study 1, with two exceptions: (1) Participants rated the target character on 20 (rather than 40) mental capacities; and (2) For younger children, the experimenter read all questions out loud and children responded verbally.

The 20 mental capacities were a subset of the 40 items used in Study 1, chosen to include physiological sensations, emotional experiences, perceptual abilities, cognitive skills, capacities related to autonomy or agency, and social abilities; and to include some of the strongest-loading items for each of the three factors uncovered among adults in Study 1 (see Figure 1). As in Study 1, each mental capacity was associated with a short, preset definition. Both older and younger children were encouraged at the beginning of the study to ask questions if they did not know what a word meant, in which case they were given these definitions. (Adults did not have access to these definitions.)

After completing the 20 questions about mental capacities, for a subset of participants we also asked two additional questions: “Is a [target] made out of metal?” and “Can a [target] be turned on and off?” These questions were always asked last, and were not intended to be included in any of our primary analyses. See SOM for an analysis of responses to these questions.

Data processing

We planned to drop trials with response times that were faster than a preset criterion of 250ms, but there were none among children, and we failed to record response times among adults. As in Study 1, we retained participants regardless of skipped trials. Overall, none of adults or older children’s trials, and only 1.22% of younger children’s trials (n=30) were missing data.

For our exploratory factor analyses, we looked at each group of partipants (adults, older children, and younger children) separately, because EFA is a group-level analysis of the consensual conceptual structure and is not designed to model continuous participant-level variables like exact age. Our goal with these analyses was to examine discrete “snapshots” of this conceptual structure at two points in this continuous developmental trajectory.

Results

Conceptual structure: Adults

As in Study 1, two or our three methods for determining how many factors to retain (in this case, parallel analysis and Weisman et al.’s factor retention criteria) suggested retaining three factors. (Minimizing BIC suggested retaining four factors, but the fourth factor was the dominant factor for only 1 mental capacity: feel happy; see SOM.)

As expected, the conceptual structure revealed by this analysis among adults was characterized by a three-way distinction between BODY (first factor, 38% of the shared variance in the rotated three-factor solution), HEART (second factor, 33% of shared variance), and MIND (third factor, 29% of shared variance). See Figure 5, Panel D.

This suggests that our modified child-friendly paradigm was valid: Using a shorter list of items and a wider range of target characters elicited the same intuitive ontology of mental life, among US adults, that was revealed in Study 1 and in Weisman et al.’s (2017) previous work.

Conceptual structure: Older children (7-9y)

Our three methods for determining how many factors to retain all suggested retaining three factors. As in Study 1, the conceptual structure revealed by this analysis among 7- to 9-year-old children was very similar to that of adults, again characterized by a three-way distinction between BODY, HEART, and MIND.

After rotation, the first factor corresponded primarily to physiological sensations. An analysis of factor congruence confirmed that this factor was most similar to adults’ BODY factor (cosine similarity with BODY: 0.97; with HEART: 0.65; with MIND: 0.63). It was the dominant factor for such items as get hungry, feel scared, feel pain, and smell things, and accounted for 39% of the shared variance in the rotated three-factor solution.

The second factor corresponded primarily to social-emotional abilities. An analysis of factor congruence confirmed that this factor was most similar to adults’ HEART factor (cosine similarity with HEART: 0.98; with BODY: 0.66; with MIND: 0.48). It was the dominant factor for such items as feel guilty, feel proud, feel embarrassed, and feel sad, and accounted for 35% of the shared variance in the rotated three-factor solution.

The third factor corresponded primarily to perceptual-cognitive abilities. An analysis of factor congruence confirmed that this factor was most similar to adults’ MIND factor (cosine similarity with MIND: 0.96; with HEART: 0.47; with BODY: 0.62). It was the dominant factor for such items as figure out how to do things, make choices, remember things, and sense temperatures, and accounted for 26% of the shared variance in the rotated three-factor solution. (See Figure 5, Panel C, for all factor loadings.)

We consider this to be a close conceptual replication of our Study 1 findings, suggesting that by the age of 7-9 years, this three-part conceptual structure is stable and robust to a range of experimental conditions.

Conceptual structure: Younger children (4-6y)

Our three methods for determining how many factors to retain each suggested retaining different numbers of factors: Weisman et al.’s factor retention criteria suggested retaining 3 factors, parallel analysis suggested retaining 2 factors, and minimizing BIC suggested a null, 1-factor solution. Here we present both the two- and three-factor solutions. (See SOM for factor loadings on the one “factor” in the null, one-factor solution, which yielded particularly strong loadings for social-emotional experiences and physiological sensations, such as get hungry, feel tired, feel happy, and feel proud.)

Three-factor solution

In the rotated three-factor solution suggested by Weisman et al.‘s retention criteria, the first factor corresponded primarily to physiological sensations, as well as some positive emotions. An analysis of factor congruence indicated that this factor was most similar to adults’ BODY factor (cosine similarity with BODY: 0.92), but was also quite similar to adults’ HEART factor (cosine similarity with HEART: 0.81; with MIND: 0.7). It was the dominant factor for such items as get angry, get hungry, get hurt feelings, and feel tired, and accounted for 40% of the shared variance in the rotated three-factor solution.

The second factor corresponded primarily to perceptual-cognitive abilities, as well as one complex negative emotion (feel guilty). An analysis of factor congruence confirmed that this factor was most similar to adults’ MIND factor (cosine similarity with MIND: 0.94; with HEART: 0.67; with BODY: 0.71). It was the dominant factor for such items as sense temperatures, remember things, feel guilty, and figure out how to do things, and accounted for 30% of the shared variance in the rotated three-factor solution.

The third factor corresponded primarily to social-emotional abilities, with particularly strong loadings for positive emotions. An analysis of factor congruence indicated that this factor was most similar to adults’ HEART factor (cosine similarity with HEART: 0.87), but also quite similar to adults’ BODY factor (cosine similarity with BODY: 0.81; with MIND: 0.62). It was the dominant factor for such items as feel happy, feel love, feel proud, and feel scared, and accounted for 30% of the shared variance in the rotated three-factor solution. (See Figure 5, Panel B, for all factor loadings.)

We would describe this conceptual structure as reminiscent of the BODY-HEART-MIND structure found among older children and adults, but not as fully “adult-like.” In particular, in this structure, the physiological sensations associated with the BODY among older children and adults are not as clearly differentiated from the emotional experiences associated with the HEART. Indeed, it it not clear that BODY vs. HEART is the most salient distinction among the first and third factors in this solution: A cleaner description of these factors might be negatively-valenced experiences vs. positively-valenced experiences.

Two-factor solution

In the rotated two-factor solution suggested by parallel analysis, the first factor encompassed both physiological sensations and emotions. An analysis of factor congruence indicated that this factor was most similar to adults’ BODY factor (cosine similarity with BODY: 0.93), but was also quite similar to adults’ HEART factor (cosine similarity with HEART: 0.88; with MIND: 0.7). It was the dominant factor for such items as get hungry, feel sick, feel happy, and get angry, and accounted for 65% of the shared variance in the rotated two-factor solution.

The second factor corresponded primarily to perceptual-cognitive abilities, as well as one complex negative emotion (feel guilty). An analysis of factor congruence confirmed that this factor was most similar to adults’ MIND factor (cosine similarity with MIND: 0.94; with HEART: 0.7; with BODY: 0.73). It was the dominant factor for such items as sense temperatures, remember things, feel guilty, and sense whether something is close by or far away, and accounted for 35% of the shared variance in the rotated three-factor solution. (See Figure 5, Panel A, for all factor loadings.)

In relation to the BODY-_HEART-MIND structure found among older children and adults, we would describe this two-factor structure as being anchored by a contrast between the cognitive capacities of the MIND vs. a set of warmer, more visercal experiences that constitute a more integrated representation of BODY-HEART.

Attributions of mental life

In Study 1, we saw that even children as old as 7-9y—whose conceptual structure seemed to be quite similar to that of adults’—nonetheless differed from adults in their application of this concept, attributing far more of the social-emotional abilities related to the HEART to both beetles and robots. How do children’s mental capacity attributions compare to adults for the larger set of target characters included in Study 2—and what does this aspect of conceptual developmental look like earlier in development (4-6y)?

Differences across age groups

Following Study 1, we projected all of children’s responses into the factor space defined by adults (standardized in terms of adults’ responses), and examined factor scores by age group (again, using the method articulated by ten Berge et al., 1999). As in Study 1, this yielded three scores for each participant, corresponding, in principle, to holistic judgments of the social-emotional, physiological, and perceptual-cognitive abilities of the target character the participant evaluated. (Note that each of these three scores takes into account adult factor loadings for all 20 mental capacities, as shown in Figure 5, Panel D.) This allowed us to examine the effects of age group (younger children, older children, adults), factor (BODY, HEART, MIND), and target character on these scores via mixed effects Bayesian regression. As in Study 1, factor was effect-coded, and age group was dummy-coded with adults as the baseline, to assess whether children in each age group were “adult-like” in their assessments. To examine differences in mental capacity attributions to different target characters, we coded each character as either “animate” (elephant, goat, mouse, bird, beetle) or “inanimate” (computer, robot, doll, teddy bear), and included animacy status (effect-coded) as a fixed effect in our regression model. We included intercepts and slopes for individual characters as random effets in our model, along with intercepts for individual participants.1

The results of this model can be found in Table 3.

Table 3: Fixed effects from a mixed-effects Bayesian regression model predicting factor scores in Study 2 by animacy status (animates, inanimates), factor (BODY, HEART, MIND), and age group (4-6y, 7-9y, adults). The model used the formula 'factor score ~ factor * age group * animacy + (1 | subject) + (1 + factor + age group | character)' and was implemented in the 'brms' package for R (Bürkner, 2017). Animacy status and factor were effect-coded; age-group was dummy-coded with adults as the baseline. Asterisks mark parameters whose 95% credible interval does not include 0.
Parameter b Error 95% CI
Adults
(Intercept) -0.08 0.07 [-0.23, 0.05]
HEART (vs. grand mean) 0.03 0.10 [-0.17, 0.21]
MIND (vs. grand mean) 0.00 0.17 [-0.35, 0.34]
characters: animates vs. inanimates 0.49 0.07 [ 0.36, 0.63] *
characters (animates/inanimates) × HEART -0.26 0.10 [-0.46, -0.07] *
characters (animates/inanimates) × MIND -0.09 0.18 [-0.44, 0.26]
7-9y vs. adults
age group (7-9y vs. adults) 0.16 0.09 [-0.02, 0.34]
HEART × age group (7-9y/adults) 0.51 0.09 [ 0.34, 0.69] *
MIND × age group (7-9y/adults) -0.44 0.09 [-0.61, -0.26] *
characters (animates/inanimates) × age group (7-9y/adults) -0.19 0.09 [-0.37, -0.01] *
characters (animates/inanimates) × HEART × age group (7-9y/adults) 0.08 0.09 [-0.09, 0.26]
characters (animates/inanimates) × MIND × age group (7-9y/adults) -0.28 0.09 [-0.46, -0.11] *
4-6y vs. adults
age group (4-6y vs. adults) 0.08 0.08 [-0.08, 0.22]
HEART × age group (4-6y/adults) 0.78 0.09 [ 0.61, 0.96] *
MIND × age group (4-6y/adults) -0.81 0.09 [-0.99, -0.62] *
characters (animates/inanimates) × age group (4-6y/adults) -0.26 0.07 [-0.41, -0.12] *
characters (animates/inanimates) × HEART × age group (4-6y/adults) 0.29 0.09 [ 0.12, 0.47] *
characters (animates/inanimates) × MIND × age group (4-6y/adults) -0.18 0.09 [-0.36, 0.00] *

By definition, adults’ factor scores did not differ across factors (HEART vs. grand mean: b = 0.03, 95% credible interval: [-0.17, 0.21]; MIND vs. grand mean: b = 0.00, 95% credible interval: [-0.35, 0.34]). As we would expect, adults attributed more mental capacities (collapsing across factors) to animates than inanimates (b = 0.49, 95% credible interval: [0.36, 0.63])—a difference that was diminished in the HEART domain (b = -0.26, 95% credible interval: [-0.46, -0.07]), but not substantially diminished in the MIND domain (b = -0.09, 95% credible interval: [-0.44, 0.26]).

As a group, 7- to 9-year-old children’s mental capacity attributions did not differ from adults, collapsing collapsing across factors and characters (b = 0.16, 95% credible interval: [-0.02, 0.34])—but this masks several important differences between older children and adults. As in Study 1, older children’s scores were characterized by a relative over-attribution of abilities in the HEART domain (b = 0.51, 95% credible interval: [0.34, 0.69]), and a relative under-attribution of abilities in the MIND domain (b = -0.44, 95% credible interval: [-0.61, -0.26]). Collapsing across factors, older children made less of a distinction between animate an inanimate target characters, relative to adults (b = -0.19, 95% credible interval: [-0.37, -0.01]). This relative under-differentiation of animate and inanimate characters was particularly pronounced in the MIND domain (b = -0.28, 95% credible interval: [-0.46, -0.11]).

How did younger children compare to adults? As a group, 4- to 6-year-old children’s mental capacity attributions did not differ from adults, collapsing collapsing across factors and characters (b = 0.08, 95% credible interval: [-0.08, 0.22])—but again, this masks a variety of developmental differences that generally parallel the differences between older children and adults just described. Much like older children, younger children’s scores were characterized by a relative over-attribution of abilities in the HEART domain (b = 0.78, 95% credible interval: [0.61, 0.96]) and a relative under-attribution of abilities in the MIND domain (b = -0.81, 95% credible interval: [-0.99, -0.62]), and they differentiated less between animate an inanimate target characters than did adults (b = -0.26, 95% credible interval: [-0.41, -0.12]). This relative under-differentiation of animate and inanimate characters was particularly pronounced in the MIND domain (b = -0.18, 95% credible interval: [-0.36, 0.00]), and less pronounced in the HEART domain (b = 0.29, 95% credible interval: [0.12, 0.47]).

A visual inspection of Figure 6 further clarifies these findings.

In the BODY domain, a distinction between animate and inanimate target characters was clearly present in all age groups, though slightly attenuated among 4- to 6-year-old children (see Figure 6, Panel A, top row). A closer look at factor scores for individual characters (Panel B, top row) suggests that younger children diverged from adults primarily in their attributions to the “edge cases” that were the focus of Study 1: the robot (to which they over-attributed the physiological sensations related to the BODY), and the beetle (to which they under-attributed such BODY capacities). Older children’s BODY attributions were generally indistinguishable from adults’ for almost all target characters. (The only possible exception is the bird—but, in our view, it appears that this was driven by adults slightly under-attributing BODY capacities to this character.)

In the HEART domain, the distinction between animate and inanimate target characters was subtler across all age groups, and the degree of distinction did not vary dramatically with age (see Figure 6, Panel A, middle row). Instead, children generally over-attributed HEART to both animates and inanimates; these over-attributions declined between 4-6y and 7-9y of age, but did not reach adult-like levels even among older children. This is consistent with Study 1, in which 7- to 9-year-old children over-attributed HEART to both the beetle and the robot, relative to adults. In this study, older children again attributed more HEART capacities to the beetle and the robot, but also to the mouse and the goat (see Panel B, middle row). Relative to other animates, adults attributed particularly few HEART capacities to the mouse and the goat—perhaps because of their respecive statuses as vermin and food animals in this cultural context.

Finally, in the MIND domain, neither group of children made a robust distinction between animates and inamates—but adults clearly did (see Figure 6, Panel A, bottom row). Instead, children generally under-attributed MIND to both animates and inanimates. These under-attributions became less dramatic between 4-6y and 7-9y of age, and by 7-9y children’s MIND attributions to inanimates were adult-like. But even at 7-9y, children did not attributed as many MIND capacities to animates as did adults; between 7-9y and adulthood, MIND attributions increased for all of the animate characters, and particularly dramatically for the bird, the mouse, and the elephant (see Figure 6, Panel B, bottom row).

The raw data further supporst these observations; see Figure 7 for raw counts of no, kinda, and yes responses for all items, grouped by factor, animacy status (Panels A-C) or character (Panels D-F), and age group. For example, consider pain (the first capacity under BODY): Across age groups, most participants said that an elephant could feel pain, with the proportion of “yes” responses increasing across age groups; meanwhile, few participants said that a computer could feel pain, with the proportion of “yes” responses decreasing across age groups. More dramatic changes are evident in the HEART and MIND factors, with attributions of HEART generally decreasing across age groups (especially to inanimate target characters - e.g., the computer, the robot), and attributions of MIND generally increasing across age groups (especially to animate target characters - e.g., the mouse, the goat, the elephant). (See SOM for an analysis, parallel to the regression analyses here, of the proportion of the top-loading mental capacities for each factor that were endorsed by participants of different ages.)

Age differences within the child samples

As in Study 1, we were interested not only in differences across age groups, but also across the—even wider—age range within our child samples. In Study 2, this included children as young as 4 years up to nearly 10 years of age. This allowed us to look at age-related differences in mental capacity attributions across a wide period from early to middle childhood.

To explore age-related differences continuously within the child samples, we conducted an additional regression analysis on children’s factor scores alone, including interactions with exact age in years (centered at the mean: 6.73y) rather than age group. See Table 4 for the full results of this model, and Figure 8 for a visualization of changes in children’s factor scores across the age range.

This analysis confirmed that, relative to the grand mean, attributions of HEART decreased with age (b = -0.09, 95% credible interval: [-0.14, -0.04]) and attributions of MIND increased with age (b = 0.13, 95% credible interval: [0.07, 0.18]). These findings are both in line with the age group analysis described in the previous section, suggesting that the observed group differences correspond to gradual developmental differences as children’s responses become increasingly adult-like.

If children were also becoming increasingly adult-like in their distinctions between animate and inanimate target characters, based on the results of our age group analysis (previous section) we would also expect the overall animate-inanimate distinction to increase with age, driven primarily by increases in the BODY and especially MIND domains (see Figure 6, Panel A). Instead, collapsing across factors, the general distinction between animates and inanimates did not differ with age (b = 0.01, 95% credible interval: [-0.02, 0.05]); decreased in the HEART domain, relative to the grand mean (b = -0.06, 95% credible interval: [-0.11, -0.01]); and did not change substantially in the MIND domain (b = -0.04, 95% credible interval: [-0.09, 0.01]).

We note that participants who assessed the robot seemed to become particularly un-adult-like at older ages (see Figure 8, Panel B, in blue). Excluding these participants yields a more coherent picture of increasing adult-like-ness with increasing age (Figure 8, Panel A, in turquoise). This did not appear to be the case when excluding any of the other inanimate target characters. We elaborate on children’s conceptualizations of the mental lives of robots in particular in the General Discussion (see also Weisman, under review). (See also SOM for an analysis of how excluding any individual target character, or any individual mental capacity, affects the conceptual structures revealed by factor analysis for each of the three age groups in Study 2.)

Table 4: Fixed effects from a mixed-effects Bayesian regression model of children's responses, predicting factor scores in Study 2 by animacy status (animates, inanimates), factor (BODY, HEART, MIND), and exact age. The model used the formula 'factor score ~ factor * age * animacy + (1 | subject)' and was implemented in the 'brms' package for R (Bürkner, 2017). Factor and animacy were effect-coded, and age was mean-centered. Asterisks mark parameters whose 95% credible interval does not include 0.
Parameter b Error 95% CI
Collapsing across age
(Intercept) 0.04 0.05 [-0.07, 0.15]
HEART (vs. grand mean) 0.68 0.09 [ 0.49, 0.86] *
MIND (vs. grand mean) -0.64 0.15 [-0.94, -0.35] *
characters: animates vs. inanimates 0.27 0.05 [ 0.16, 0.38] *
characters (animates/inanimates) × HEART -0.07 0.09 [-0.25, 0.11]
characters (animates/inanimates) × MIND -0.31 0.14 [-0.58, -0.02] *
Age effects
age (centered at the mean) 0.03 0.02 [ 0.00, 0.07]
HEART × age -0.09 0.03 [-0.14, -0.04] *
MIND × age 0.13 0.03 [ 0.07, 0.18] *
characters (animates/inanimates) × age 0.01 0.02 [-0.02, 0.05]
characters (animates/inanimates) × HEART × age -0.06 0.03 [-0.11, -0.01] *
characters (animates/inanimates) × MIND × age -0.04 0.03 [-0.09, 0.01]

Discussion

We had three goals in Study 2: (1) To test whether the adult-like conceptual structure revealed among 7- to 9-year-old children in Study 1 would hold under the range of conditions that elicit this structure among US adults in Weisman et al.’s (2017) previous work; (2) To explore conceptual structure at an earlier point in development (4-6y); and (3) To explore age-related differences in the application of concepts of mental life by examining which mental capacities participants of different ages tended to attribute to the nine target characters included in this study.

Conceptual structure is robust among 7- to 9-year-old children

Regarding our first goal, Study 2 suggests that the three-part conceptual structure—anchored by BODY, HEART, and MIND—is reliable and robust among 7- to 9-year-old US children. As in Weisman et al.’s (2017) original work with adults, the capacities that “hang together” in older children’s reasoning when target characaters are perceived to vary in mental capacity profiles appear to be highly similiar to those that “hang together” when participants disagree about the mental lives of controversial “edge cases” in social reasoning (Study 1).

Conceptual structure changes between 4-6y and 7-9y

Regarding our second goal, Study 2 suggests that this conceptual structure undergoes substantial changes between early and middle childhood. Like older children and adults, 4- to 6-year-old children’s responses were characterized by strong correlations among a suite of perceptual and cognitive capacities that we have labeled MIND. This highlights one aspect of conceptual structure that seems to be relatively stable from early childhood onward.

However, in contrast to the clear distinction between physiological abilities and social-emotional abilities that characterized mental capacity attributions among older children and adults, younger children’s responses suggest that they perceived physiological and social-emotional abilities to be more closely integrated and the line between them to be more blurred.

One indication of this blurring comes from the two-factor solution suggested by parallel analysis, in which a single BODY-HEART factor emerged and was highly congruent with both the BODY (cosine similarity: 0.93) and HEART (0.88) factors of adults. Among the mental capacities that loaded strongly (\(\geq\) 0.60) on this factor were both physiological sensations (e.g., get hungry, feel sick…) and social-emotional experiences (feel happy, feel proud, feel sad, get hurt feelings), suggesting that younger children perceived physiological and social-emotional abilities to “go together” to a considerable degree.

Even in the 3-factor solution suggested by Weisman et al.‘s (2017) original factor retention protocol, the distinction between physiological and social-emotional abilities was somewhat blurred. While the first factor, which we’ve labeled BODY*, was highly congruent with adults’ BODY factor (cosine similarity: 0.92), it was also the dominant factor for two social-emotional items (get hurt feelings, feel sad). And while the third factor, which we’ve labeled HEART*, was highly congruent with adults’ HEART factor (cosine similarity: 0.87), there were several social-emotional items that failed to load strongly on it (loadings \(\leq\) 0.40: feel embarrassed, feel sad, get hurt feelings, feel guilty). Stepping back, it is not clear that “physiological vs. social-emotional” is the best way to characterize the differences between these two factors. In fact, given that the strongest-loading items for BODY* were negatively valenced (get angry, get hungry, get hurt feelings) while the strongest-loading items for HEART* were positively valenced (feel happy, feel love, feel proud), it seems plausible that the more salient distinction among this age group may have been positive vs. negative valence, rather than BODY vs. HEART. The salience on negative vs. positive experiences among younger children is consistent with recent work on the development of emotion concepts, which suggests that emotion representations are dominanted by a single dimension of valence in early to middle childhood, before unfolding into a two-dimensional space characterized by valence and arousal over the course of later childhood and adolesence (Nook et al., 2017).

Finally, the very fact that different approaches to factor retention yielded different results is further evidence that, although we observed some evidence for a nascent distinction between BODY and HEART among 4- to 6-year-old children, this distinction was not as robust as it appeared to be among older children or adults.

Developmental changes in attributions of all three components of mental life—BODY, HEART, and MIND—begin by early childhood and continue into middle childhood

Regarding our third goal, Study 2 revealed a wide variety of age-related changes in children’s mental capacity attributions, in all three aspects of mental life as conceptualized by adults.

In Study 1, we observed that 7- to 9-year-old children’s attributions of HEART were particularly un-adult-like: As a group, these children attributed much more in the way of social-emotional abilities to both a beetle and a robot than did adults (according to an analysis of factor scores, with children’s data projected into adults’ conceptual space). In the Study 1 sample, this difference appeared to decline with age between 7-9y, but never quite reached adult-like levels.

In line with this, Study 2 also revealed age-related differences in attributions of HEART: Relative to adults, children across the age range tended to over-attribute social-emotional abilities—not only to the robot and the beetle, but to most of the target characters included in this study (see Figure 6). Again, this tendency generally declined with age, with one exception: If anything, children’s attributions of HEART to robots appeared to increase between 4-9y of age in this sample (though not substantially, according to a Bayesian regression: b = 0.16, 95% credible interval: [-0.05, 0.37]). The subset of 4- to 9-year-old children who assessed the robot (n=26) in Study 2 constituted a much smaller sample than the 96 7- to 9-year-old children who assessed the robot in Study 1, so the “true” developmental trajectory of HEART attributions to robots remains unclear. (We return to this question armed with more data from 4- to 6-year-old children in Study 3, and make further remarks on children’s attributions to robots more generally in the General Discussion.) Setting aside robots for the moment, our general take-aways from Studies 1-2 are that chidlren’s attributions of social-emotional abilities (what we call HEART) appear to undergo especially dramatic developmental changes over the course of early and middle childhood. These changes seem to be generally monotonic in nature; that is, we see gradual decreases in social-emotional attributions across the board from 4-9y, and no strong evidence for non-linearities. Finally, these developmental changes appears to extend well into middle childhood, and perhaps beyond.

Beyond the general decline in HEART attributions with age, we also observed age-related differences in attributions of both BODY and especially MIND, which were revealed most clearly thorugh an examination of children’s mental capacity attributions to animate beings (beetle, bird, mouse, goat, elephant) vs. inanimate objects (computer, robot, doll, teddy bear).

In the BODY domain, a distinction between animate and inanimate target characters was clearly present even among the youngest children, but increased gradually across the 4-7y age range (appearing to reach a degree of separation comparable to adults sometime between 7-9y; see Figure 8). As described above, younger children diverged from adults primarily in their attributions of BODY to the “edge cases” that were the focus of Study 1: the robot and the beetle. Looking back at Study 1, we observe a similar, though subtler, pattern even among 7- to 9-year-old children when the set of target characters was limited to these edge cases. Taken together, these results suggest that while by the age of 4-6y children are relatively far along in their mastery of which entities in the world are subject to the physiological sensations of the BODY, they continue to refine their application of this concept throughout early (and perhaps into middle) childhood.

Finally, in the MIND domain, we observed unanticipated age-related differences that were perhaps even more striking than the differences in the HEART domain described earlier. Relative to adults, children across the age range tended to under-attribute perceptual and cognitive abilities, both to inanimate target characters and especially to animate target characters. Generally speaking, children’s under-attributions of MIND became less pronounced with age—but even the oldest children attributed less in the way of perceptual-cognitive abilities to such target characters as the elephant, the mouse, and the bird than did adults (see Figure 6).

Interim summary

In Studies 1-2 we documented differences in the conceptual structure underlying mental capacity attributions between early childhood (4-6y) and middle childhood (7-9y), as well as age-related changes in children’s application of these concepts—i.e., their attributions of different aspects of mental life to different target characters—which appear to be underway by early childhood and extend well into middle childhood and beyond. We have interpreted both kinds of differences as aspects of conceptual development in this domain.

One major limitation of Studies 1-2, however, was that the task involved a rather advanced set of mental state vocabulary terms, including a variety of complex mental capacities (e.g., guilt, pride, awareness, depth perception) and using somewhat complicated syntax for some items (e.g., sense whether something is close by or far away, figure out how to do things). For 4- to 6-year-old children, in particular, some of the mental capacity items might have been outside of the range of the words they normally hear in discussions of mental states—let alone the words they normally use themselves. In addition, younger children may have found some aspects of the experimental paradigm distracting (e.g., being seated in front of the experimenter’s laptop computer without being allowed to use it themselves) or difficult (e.g., using a three-point scale with minimal visual scaffolding; see SOM for an analysis of scale use across age groups).

Thus, in our final study, we focused on 4- to 6-year-old children, using a simpler set of mental capacities and a modified version of the experimental paradigm (validated among adults) with the aim of getting a clearer picture of conceptual structure and mental capacity attributions at this earlier point in development.

Study 3

The primary goal of Study 3 was to provide a conceptual replication and extension of our findings in Study 2 that the conceptual structure underlying mental capacity attributions among 4- to 6-year-old children is different from that of older children and adults, particularly in terms of the relationship between BODY and HEART. In light of our concerns about vocabulary, attention, and use of the response scale among 4- to 6-year-old children in Study 2, we designed an even more child-friendly version specifically tailored to appropriate for young preschoolers, by streamlining the experimental protocol, providing more scaffolding for the response scale, and including only vocabulary items that were pre-tested to be familiar to young preschool children (see “Method”).

A second goal of Study 3 was to assess younger children’s attributions of mental life to what we have called “edge cases” in social reasoning: a beetle (an atypical animal) and a robot (an atypical object). In Studies 1 and 2, children of all ages appear to have attributed more social-emotional abilities (HEART) and fewer perceptual-cognitive abilities (MIND) to both of these edge cases, as compared to adults. In Study 2, 4- to 6-year-old children appear to have been particularly un-adult-like in their attributions to the beetle and the robot—but because participants were distributed across a wide range of target characters, we could not chart these differences with any precision. In contrast, in Study 1 the approach of focusing on “edge cases” in particular allowed us to estimate older children’s aggregate attributions to these entities with precision, because large numbers of children assessed each of the two target characters. In Study 3, we returned to this “edge case” approach, limiting the target characters to a beetle and a robot.

Method

Participants

148 people participated in this study, including a group of adults and a group of 4- to 6-year-old children.

Adults (n=104) participated via MTurk in September 2018. Adult participants had gained approval for at least 95% of their previous work on MTurk; had MTurk accounts based in the US; and indicated that they were at least 18 years old. Adults were paid $0.45 for approximately 2-4 minutes of their time (median duration: 3.76 min). An additional 21 adults participated but were excluded for failing to respond sensibly to an open-ended question about what they had been asked to do in the study (see Study 2 for examples; n=16) or for failing to pass one or more attention checks (e.g., “Please select no”; n=5). According to self report, the final adult sample ranged in age from 23-71 years (median: 35y) and included slightly more men (56%) than women (43%). Adults predominantly identified as White (71%; 12% identified as Black; 7% identified as more than one race/ethnicity, and \(\leq\) 12% as any other race/ethnicity).

XX CHECK WHEN SAMPLE IS COMPLETE: Our planned sample size was 100 4- to 6-year-old children. Our final sample of children (n=44) ranged in age from 4.02-5.59 years (median: 4.73y), and participated at a university-affiliated preschool in the Bay Area between January-XX 2018. We did not record study duration. According to school records, the sample of younger children included slightly more girls (23%) than boys (34%). Children were predominantly identified as White (32%) or multiracial (16%; \(\leq\) 5% of children were identified as any other race/ethnicity, and 43% of children’s parents declined to provide information on their race/ethnicity).

An additional XX children participated but were excluded for being outside the target age ranges.

Materials and procedure

Materials and procedure were adapted to be more appropriate for young preschoolers, with two primary goals in mind: Streamlining the experimental protocol to improve children’s comprehension and attention to the task, and limiting mental capacities to words that are highly familiar to young preschool children.

In order to streamline the experimental protocol, we moved the task off of the computer (for children but not adults), instead using printed photographs of the target characters (measuring approximately 5 x 8 inches, printed in color and laminated) and recording children’s responses by hand. At the time of testing, the experimenter and child sat side by side at a table, with the photograph placed on the table directly in front of the child for the duration of the task.

We also streamlined the introduction to the task. The experimenter began by placing the photograph of the first target character in front of the child and asking, “Can you tell me what this is?” If a child provided an answer other than “beetle” or “robot,” the experimenter said something to the effect of, “I’m going to call it a [beetle/robot]”; otherwise, the experimenter affirmed the child’s correct response. The experimenter then said, “We’re going to play a game about [beetles/robots]”; reminded children, “If you ever want to stop playing, you can just let me know and we’ll go back to the classroom” (per this university preschool’s protocol); and then launched directly into the first question (e.g., “Can beetles get sad?”).

We scaffolded children’s use of the three-point response scale by providing a physical representation of the scale, consisting of three large boxes, separated by blank space, containing the words “NO,” “KINDA,” and “YES” written in large font with all capital letters (to aid children with at least some reading skills in recognizing these words); color-coded according to the intensity of response (NO = very light blue, KINDA = medium blue, YES = dark blue); and ordered from left (NO) to right (YES). Each box measured approximately 2 x 4 inches; the boxes were laminated with slightly less than 1 inch of empty space between them (through which the table was visible). In addition to providing these visual and spatial cues to the fact that there were three response options—no, yes, and something conceptually and literally “in between” these extremes—we also added a line to the experimenter’s script describing (and then reiterating) these response options on the first three trials (“You can say no [pointing to NO], kinda [pointing to KINDA], or yes [pointing to YES]”). The experimenter repeated these options on the first three trials for all children, and on any other trials where a child took more than a few seconds to answer or provided a response other than saying “yes,” “kinda,” or “no” or clearly pointing to one of these options on the response scale.

For each of the two target characters (beetle, robot), children answered 18 questions about its mental capacities. These items were chosen to be as short as possible and to be highly familiar to young preschool children. They were selected from a larger pilot study in which we asked 3- to 5-year-old children to complete stories that began with each of these mental capacities as a premise (e.g., “Let’s imagine a person who loves someone. What happens next?”; “Now let’s pretend that someone remembers something. What happens next?”) and judged the appropriateness of their story completion.

For the final set of questions, we aimed to select six clear examples of physiological sensations (BODY), social-emotional abilities (HEART), and perceptual-cognitive capacities (MIND), according to Studies 1-2 and Weisman et al.’s (2017) original studies with US adults. We reasoned that if these carefully selected examples of BODY, HEART, and MIND still elicited differences in correlational structures between 4- to 6-year-old children and adults, this would be particularly strong evidence of age-related changes in conceptual structure.

The final set of BODY items included feel hungry, get thirsty, feel sick, feel tired, get scared, and smell things. HEART items included love someone, hate someone, feel happy, get sad, feel sorry, and get lonely. MIND items included see, hear, think, remember things, know stuff, and figure things out. We ensured that each category included a variety of phrasings (e.g., “feel hungry” vs. “get thirsty”; “remember things” vs. “know stuff”) and valences when appropriate (e.g., happiness vs. sadness); when possible, we aimed to have these aspects of phrasing vary orthogonally with categories, such that “get” and “feel” appeared roughly equally often among the BODY and HEART items, and “things” appeared equally often among the BODY and MIND items. As in Studies 1-2, each mental capacity was associated with a short, preset definition, which was read to children if they expressed uncertainty about what a word meant or did not respond after prompting use of the response scale (see SOM).

Children first assessed all 18 mental capacities for one of the two target characters (e.g., the beetle), then completed an easy jigsaw puzzle featuring clothing and accessories appropriate for a rainy day (which took about 30-60 s to complete), and finally assessed all 18 mental capacities for the other target character (e.g., the robot).

This modified procedure—particularly moving the experiment off of the computer for children—required several changes to the experimental design. Rather than randomly assigning children to assess the beetle first or the robot first, the order of target characters was counterbalanced in advance. Likewise, rather than asking about the 18 mental capacities in a random order, questions about the first target character were asked in one of 8 pre-made random orders, and questions about the second target character were asked in the reverse order. The order of the target characters (beetle-robot or robot-beetle) and the order of the mental capacity questions (sequences 1-8) were fully crossed across participants.

Adults participated in an online version of this same task, without a break between target characters. As in Studies 1-2, adults clicked through a website at their own pace, with one trial presented on each page and no ability to go backwards.

Data processing

We did not record response times or use this as a criterion for inclusion. As in Studies 1-2, we retained participants regardless of skipped trials (n=XX trials among children; XX% of all trials).

Following Weisman et al. (2017, Study 4), for our exploratory factor analyses we treated each participant’s assessments of each target character as a separate set of observations (as if they came from different participants). This effectively doubled our sample size to 3744 adults and 1548 children. (See SOM for separate EFAs of the participants’ responses to the first target character that they were assigned to rate vs. the second character.)

Results

Conceptual structure: Adults

All of our factor retention protocols suggested retaining three factors.

As expected, the conceptual structure revealed by this analysis among adults was characterized by a three-way distinction between BODY (first factor, 41% of the shared variance in the rotated three-factor solution), HEART (second factor, 35% of shared variance), and MIND (third factor, 23% of shared variance). See Figure 9, Panel C.

This suggests that our modified preschooler-friendly paradigm was valid: Using simpler vocabulary and a within-subjects approach to taget characters elicited the same intuitive ontology of mental life, among US adults, that was revealed in Studies 1-2 and in Weisman et al.’s (2017) previous work.

Conceptual structure: Children (4-6y)

As in Study 2, our three methods for determining how many factors to retain each suggested retaining different numbers of factors: In this case, Weisman et al.’s factor retention criteria suggested retaining 4 factors, parallel analysis suggested retaining 3 factors, and minimizing BIC suggested a null, 1-factor solution. Here we present both the four- and three-factor solutions. (See SOM for factor loadings on the one “factor” in the null, one-factor solution, which—as in Study 2—yielded particularly strong loadings for social-emotional experiences and physiological sensations, such as think, get sad, get thirsty, and feel tired.)

Four-factor solution

In the rotated four-factor solution suggested by Weisman et al.‘s retention criteria, the first factor corresponded primarily to perceptual-cognitive abilities, as well as some positive emotions. An analysis of factor congruence confirmed that this factor was most similar to adults’ MIND factor (cosine similarity with MIND: 0.87; with HEART: 0.67; with BODY: 0.32). It was the dominant factor for such items as know stuff, remember things, love someone, and think, and accounted for 30% of the shared variance in the rotated four-factor solution.

The second factor corresponded primarily to physiological sensations, as well as one negative emotion (get sad). An analysis of factor congruence indicated that this factor was most similar to adults’ BODY factor (cosine similarity with BODY: 0.87; with HEART: 0.56; with MIND: 0.35). It was the dominant factor for such items as know stuff, remember things, love someone, and think, and accounted for 30% of the shared variance in the rotated four-factor solution.

The third factor also corresponded to physiological sensations, as well as one perceptual ability (see). An analysis of factor congruence indicated that this factor was most similar to adults’ BODY factor (cosine similarity with BODY: 0.78; with HEART: 0.41; with MIND: 0.5). It was the dominant factor for such items as know stuff, remember things, love someone, and think, and accounted for 30% of the shared variance in the rotated four-factor solution.

Finally, the fourth factor corresponded primarily to social-emotional abilities, with particularly strong loadings for negative emotions. An analysis of factor congruence indicated that this factor was most similar to adults’ HEART factor (cosine similarity with HEART: 0.77; with BODY: 0.45; with MIND: 0.4). It was the dominant factor for such items as get thirsty, hear, feel hungry, and see, and accounted for 22% of the shared variance in the rotated four-factor solution. (See Figure 9, Panel A, for all factor loadings.)

As in Study 1, we would describe this conceptual structure as reminiscent of the BODY-HEART-MIND structure found among older children and adults, but not as fully “adult-like.” In particular, in this structure, the social-emotional abilities associated with the HEART among older children and adults are not as clearly differentiated from either the physiological sensations of the BODY or the perceptual-cognitive abilities of the MIND. Moreover—in a divergence from Study 2—in this case the physiological sensations of the BODY are split across two factors.

Three-factor solution

In the rotated three-factor solution suggested by parallel analysis, the first corresponded primarily to physiological sensations. An analysis of factor congruence indicated that this factor was most similar to adults’ BODY factor (cosine similarity with BODY: 0.95; with HEART: 0.57; with MIND: 0.43). It was the dominant factor for such items as feel hungry, smell things, get thirsty, and feel tired, and accounted for 43% of the shared variance in the rotated three-factor solution.

The second factor corresponded primarily to perceptual-cognitive abilities, as well as one positive emotion (feel happy). An analysis of factor congruence confirmed that this factor was most similar to adults’ MIND factor (cosine similarity with MIND: 0.88; with HEART: 0.64; with BODY: 0.38). It was the dominant factor for such items as know stuff, remember things, think, and hear, and accounted for 35% of the shared variance in the rotated three-factor solution.

The third factor corresponded primarily to social-emotional abilities, as well as one positive emotion (feel happy). An analysis of factor congruence confirmed that this factor was most similar to adults’ HEART factor (cosine similarity with MIND: 0.8; with BODY: 0.38; with MIND: 0.45). It was the dominant factor for such items as know stuff, remember things, think, and hear, and accounted for 35% of the shared variance in the rotated three-factor solution. (See Figure 9, Panel B, for all factor loadings.)

In relation to the BODY-HEART-MIND structure found among older children and adults, we would describe this three-factor structure as being fairly similar to the adult-like conceptual structure—with the notable exception that half of the social-emotional abilities (get sad, hate someone, and feel happy) did not load most strongly on children’s ostenstive HEART* factor.

Attributions of mental life

XX

Children vs. adults

XX

Age differences within the child sample

XX

Discussion

XX

General Discussion

Summary

The current studies suggest that children’s conceptual representations of mental life undergo substantial development between the ages of 4-9 years—in two distinct senses.

First, analyses of the correlational structure of children’s mental capacity attributions (EFAs) suggested changes in conceptual structure: Between early childhood (4-6 years; Studies 2-3) and middle childhood (7-9 years; Studies 1-2), children’s sense of which mental capacities “go together” seemed to unfold into a higher-dimensional space, characterized by stronger differentiation of the social-emotional abilities that we’ve called “heart” from the physiological sensations of the body and the perceptual-cognitive abilities of the mind. Meanwhile, analyses of factor scores—summaries of which mental capacities children tended to attribute to which target characters—revealed a second kind of age-related difference: what we might call changes in the application of the concept. These differences were clearest in Studies 1 and 3, which focused on two “edge cases” in social reasoning (beetles and robots): Between the ages of 4-6 years (Study 3), XX FILL IN, while between the ages of 7-9 years (Study 1), attributions of body to beetles and robots were relatively stable and adult-like, attributions of heart to these “edge cases” started out higher than adults and decreased to nearly adult-like levels by the age of 9 years, and attributions of mind started out lower than adults and increased to nearly adult-like levels by the age of 9 years.

XX GD


  1. We notes that the complexities of the design of Study 2 could lend themselves to more complex models than what we have presented here, and we encourage readers to examine a model including multiple comparisons between sets of characters (e.g., mammals vs. non-mammals; technologies vs. toys) presented in the SOM. All of the effects described below also hold true in this more complex model.

LS0tCnRpdGxlOiAiQ2hpbGRyZW4ncyBkZXZlbG9waW5nIHJlcHJlc2VudGF0aW9ucyBvZiBtZW50YWwgbGlmZTogQ2hhbmdlcyBpbiBjb25jZXB0dWFsCiAgc3RydWN0dXJlIGJldHdlZW4gNC05IHllYXJzIG9mIGFnZSIKYXV0aG9yOiAiS2FyYSBXZWlzbWFuLCBDYXJvbCBTLiBEd2VjaywgJiBFbGxlbiBNLiBNYXJrbWFuIgpzdWJ0aXRsZTogRHJhZnQgdXBkYXRlZCAyMDE4LTA5LTI1Cm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNAogICAgdG9jX2Zsb2F0OiB5ZXMKLS0tCgpgYGB7ciBnbG9iYWxfb3B0aW9ucywgaW5jbHVkZSA9IEZ9CmtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMC42NywgCiAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlID0gRiwgZWNobyA9IEYpCmBgYAoKYGBge3J9CiMgIyBmb3Iga25pdHRpbmcgdG8gLmRvY3gKIyBvdXRwdXQ6CiMgICB3b3JkX2RvY3VtZW50OgojICAgICByZWZlcmVuY2VfZG9jeDogIi4vd29yZC1zdHlsZXMtcmVmZXJlbmNlLmRvY3giCiMgYWx3YXlzX2FsbG93X2h0bWw6IHllcwogICAKIyAjIGZvciBrbml0dGluZyB0byAubmIuaHRtbCAKIyBvdXRwdXQ6CiMgICBodG1sX25vdGVib29rOgojICAgICB0b2M6IHllcwojICAgICB0b2NfZGVwdGg6IDQKIyAgICAgdG9jX2Zsb2F0OiB5ZXMKYGBgCgoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHBzeWNoKQpsaWJyYXJ5KGxhbmdjb2cpICMgc291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vbGFuZ2NvZy9sYW5nY29nLXBhY2thZ2UKIyBsaWJyYXJ5KGxtZTQpCmxpYnJhcnkoYnJtcykKbGlicmFyeShzdHJpbmdpKQpsaWJyYXJ5KGNvd3Bsb3QpCmxpYnJhcnkoa2FibGVFeHRyYSkKCnRoZW1lX3NldCh0aGVtZV9idygpKQpgYGAKCmBgYHtyfQojIHN1cHBvcnRpbmcgZnVuY3Rpb25zCnNvdXJjZSgiLi9zY3JpcHRzL21heF9mYWN0b3JzX2VmYS5SIikKc291cmNlKCIuL3NjcmlwdHMvcmV0ZW5fZnVuLlIiKQpzb3VyY2UoIi4vc2NyaXB0cy9wbG90X2Z1bi5SIikKc291cmNlKCIuL3NjcmlwdHMvZWZhX2Z1bi5SIikKCiMgZGF0YSBzY3JpcHRzCnNvdXJjZSgiLi9zY3JpcHRzL2RhdGFfczFfYWQuUiIpCnNvdXJjZSgiLi9zY3JpcHRzL2RhdGFfczFfNzkuUiIpCnNvdXJjZSgiLi9zY3JpcHRzL2RhdGFfczJfYWQuUiIpCnNvdXJjZSgiLi9zY3JpcHRzL2RhdGFfczJfNzkuUiIpCnNvdXJjZSgiLi9zY3JpcHRzL2RhdGFfczJfNDYuUiIpCnNvdXJjZSgiLi9zY3JpcHRzL2RhdGFfczNfYWQuUiIpCnNvdXJjZSgiLi9zY3JpcHRzL2RhdGFfczNfNDYuUiIpCgojIGZ1bmN0aW9uIGZvciBxdWlja2x5IGdldHRpbmcgY291bnRzIGFuZCBwcm9wb3J0aW9ucyBmb3IgY2F0ZWdvcmljYWwgZGVtbyB2YXJpYWJsZXMKZGVtb19mdW4gPC0gZnVuY3Rpb24oZGYsIHZhciwgbl9yb3VuZCA9IE5BKXsKICBuZXdfZGYgPC0gZGYgJT4lCiAgICBkaXN0aW5jdF8oInN1YmlkIiwgdmFyKSAlPiUKICAgIG11dGF0ZV9hdCgudmFycyA9IHZhciwKICAgICAgICAgICAgICAuZnVucyA9IC4gJT4lIGFzLmNoYXJhY3RlcigpICU+JSByZXBsYWNlX25hKC4sICJNSVNTSU5HIikpICU+JQogICAgY291bnRfKHZhcikgJT4lCiAgICBtdXRhdGUocHJvcCA9IG4vc3VtKG4pKSAlPiUKICAgIGFycmFuZ2UoZGVzYyhuKSkKICBpZighaXMubmEobl9yb3VuZCkpewogICAgbmV3X2RmIDwtIG5ld19kZiAlPiUgbXV0YXRlKHByb3AgPSByb3VuZChwcm9wLCBuX3JvdW5kKSkKICB9CiAgcmV0dXJuKG5ld19kZikKfQoKIyBmdW5jdGlvbiBmb3IgZ2V0dGluZyB3cml0ZS11cCBvZiBicm1zIG1vZGVsIHJlc3VsdHMKd3JpdGVfYl85NUNJX2Z1biA8LSBmdW5jdGlvbihtb2RlbCwgcGFyYW0sIHJvdW5kX24gPSAyKXsKICBmaXhlZiA8LSBmaXhlZihtb2RlbCkgJT4lIHJvdW5kKHJvdW5kX24pICU+JSBmb3JtYXQobnNtYWxsID0gcm91bmRfbikKICBiIDwtIGZpeGVmW3BhcmFtLCAiRXN0aW1hdGUiXQogIGxvd2VyIDwtIGZpeGVmW3BhcmFtLCAiUTIuNSJdCiAgdXBwZXIgPC0gZml4ZWZbcGFyYW0sICJROTcuNSJdCiAgdGV4dCA8LSBwYXN0ZTAoIl9iXyA9ICIsIGIsIAogICAgICAgICAgICAgICAgICIsIDk1JSBjcmVkaWJsZSBpbnRlcnZhbDogWyIsIGxvd2VyLCAiLCAiLCB1cHBlciwgIl0iKQogIHRleHQgPC0gZ3N1YigiXFxbICIsICJcXFsiLCB0ZXh0KQogIHJldHVybih0ZXh0KQp9CgpiaW5vbWlhbF9zbW9vdGggPC0gZnVuY3Rpb24oLi4uKSB7CiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImdsbSIsIG1ldGhvZC5hcmdzID0gbGlzdChmYW1pbHkgPSAiYmlub21pYWwiKSwgLi4uKQp9CgppdGFsX2J5X2NhcF9mdW4gPC0gZnVuY3Rpb24oc3RyKSB7CiAgcGFzdGUwKCJfIiwgcGFzdGUoc3RyLCBjb2xsYXBzZSA9ICJfLCBfIiksICJfIikKfQpgYGAKCmBgYHtyfQojIHdoYXQgY29ycmVsYXRpb24gdG8gdXNlCmNob3Nlbl9jb3IgPC0gImNvciIgIyByZXBvcnRlZAojIGNob3Nlbl9jb3IgPC0gInBvbHkiICMgYWx0ZXJuYXRpdmUgb3B0aW9uCgojIHdoYXQgcm90YXRpb24gdG8gdXNlCmNob3Nlbl9yb3QgPC0gInZhcmltYXgiICMgcmVwb3J0ZWQKIyBjaG9zZW5fcm90IDwtICJvYmxpbWluIiAjIGFsdGVybmF0aXZlIG9wdGlvbgoKIyB3aGF0IGZhY3RvcmluZyBtZXRob2QgdG8gdXNlCmNob3Nlbl9mbSA8LSAibWlucmVzIiAjIHJlcG9ydGVkIChzZWUgYWx0ZXJuYXRpdmUgb3B0aW9ucyBpbiA/ZmEpCgojIHdoYXQgc2NvcmluZyBtZXRob2QgdG8gdXNlCmNob3Nlbl9zY29yZXMgPC0gInRlbkJlcmdlIiAjIHJlcG9ydGVkCiMgY2hvc2VuX3Njb3JlcyA8LSAicmVncmVzc2lvbiIgIyBhbHRlcm5hdGl2ZSBvcHRpb24KYGBgCgojIEFic3RyYWN0CgpYWAoKIyBJbnRyb2R1Y3Rpb24KClhYCgpJbiB0aGlzIHBhcGVyLCB3ZSBmaXJzdCBpbnRyb2R1Y2UgYSBjaGlsZC1mcmllbmRseSB2ZXJzaW9uIG9mIFdlaXNtYW4gZXQgYWwuJ3MgKDIwMTcpIGV4cGVyaW1lbnRhbCBwYXJhZGlnbSwgdmFsaWRhdGUgaXQgYW1vbmcgVVMgYWR1bHRzLCBhbmQgdGhlbiB1c2UgdGhpcyBwYXJhZGlnbSB0byBjb25kdWN0IGFuIGluaXRpYWwgZXhwbG9yYXRpb24gb2YgdGhpcyBjb25jZXB0dWFsIHN0cnVjdHVyZSBhbmQgbWVudGFsIGNhcGFjaXR5IGF0dHJpYnV0aW9ucyBhbW9uZyBVUyBjaGlsZHJlbiwgZm9jdXNpbmcgb24gNy0gdG8gOS15ZWFyLW9sZCBjaGlsZHJlbiAoU3R1ZHkgMSkuIE5leHQsIHdlIHJlcGxpY2F0ZSBvdXIgZmluZGluZ3Mgd2l0aCA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuIHVzaW5nIGEgYnJpZWZlciBleHBlcmltZW50YWwgcGFyYWRpZ20sIGFuZCB1c2UgdGhpcyBicmllZmVyIHBhcmFkaWdtIHRvIGFzc2VzcyB0aGUgZWFybGllciBkZXZlbG9wbWVudCBvZiB0aGlzIGNvbmNlcHR1YWwgc3RydWN0dXJlLCBmb2N1c2luZyBvbiA0LSB0byA2LXllYXItb2xkIGNoaWxkcmVuIChTdHVkeSAyKS4gV2UgdGhlbiBkZXZlbG9wIGFuIGV2ZW4gc2ltcGxlciB2ZXJzaW9uIG9mIHRoZSBwYXJhZGlnbSwgdXNpbmcgbW9yZSBiYXNpYyB2b2NhYnVsYXJ5IGFuZCBhIHN0cmVhbWxpbmVkIGV4cGVyaW1lbnRhbCBwcm90b2NvbCwgd2l0aCB0aGUgYWltIG9mIHZhbGlkYXRpbmcgYW5kIHJlZmluaW5nIG91ciB1bmRlcnN0YW5kaW5nIG9mIGNvbmNlcHR1YWwgc3RydWN0dXJlIGFtb25nIDQtIHRvIDYteWVhci1vbGQgY2hpbGRyZW4sIGFzIHdlbGwgYXMgZXhwbG9yaW5nIGhvdyB5b3VuZ2VyIGNoaWxkcmVuJ3MgYXR0cmlidXRpb25zIG9mIGRpZmZlcmVudCBhc3BlY3RzIG9mIG1lbnRhbCBsaWZlIG1pZ2h0IHZhcnkgd2l0aCBhZ2UgKFN0dWR5IDMpLiBGaW5hbGx5LCB0byBzdXBwbGVtZW50IHRoZSBncm91cC1sZXZlbCBhbmFseXNlcyBwaWN0dXJlIG9mIGRldmVsb3BtZW50IHByb3ZpZGVkIGJ5IHRoZSBleHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzZXMgZm9yIFN0dWRpZXMgMS0zLCB3ZSByZS1hbmFseXplIHRoZXNlIGRhdGEgdXNpbmcgYSBub3ZlbCwgcGFydGljaXBhbnQtbGV2ZWwgYXBwcm9hY2ggdGhhdCBhbGxvd3MgdXMgdG8gb2JzZXJ2ZSBob3cgdGhlc2UgY29uY2VwdHVhbCBzdHJ1Y3R1cmVzIG1pZ2h0IGV2b2x2ZSBhbmQgdW5mb2xkIGNvbnRpbnVvdXNseSBvdmVyIGRldmVsb3BtZW50ICgiQ29udGludW91cyBkZXZlbG9wbWVudCBhdCB0aGUgcGFydGljaXBhbnQgbGV2ZWw6IEEgcmUtYW5hbHlzaXMgb2YgU3R1ZGllcyAxLTMiKS4KCiMgT3ZlcnZpZXcgb2YgTWV0aG9kcyBhbmQgQW5hbHlzZXMKClN0dWRpZXMgMS0zIHVzZWQgdmVyeSBzaW1pbGFyIGV4cGVyaW1lbnRhbCBwYXJhZGlnbXMgYW5kIHdlcmUgZGVzaWduZWQgd2l0aCB0aGUgc2FtZSBhbmFseXNlcyBpbiBtaW5kLiBIZXJlIHdlIHByb3ZpZGUgYW4gb3ZlcnZpZXcgb2YgdGhlIG1ldGhvZHMgYW5kIHBsYW5uZWQgYW5hbHlzZXMgZm9yIGFsbCBvZiB0aGVzZSBzdHVkaWVzOyBhbnkgZGV0YWlscyB0aGF0IHZhcmllZCBhY3Jvc3Mgc3R1ZGllcyBhcmUgc3VwcGxpZWQgaW4gdGhlICJNZXRob2RzIiBzZWN0aW9uIG9mIGVhY2ggb2YgdGhlIHN0dWRpZXMuIAoKIyMgR2VuZXJhbCBtZXRob2RzCgpGb2xsb3dpbmcgV2Vpc21hbiBldCBhbC4gKDIwMTcpLCB0aGVzZSBzdHVkaWVzIHdlcmUgZGVzaWduZWQgd2l0aCB0aGUgZ29hbCBvZiBmb2N1c2luZyBwYXJ0aWNpcGFudHMnIGF0dGVudGlvbiBvbiB0aGUgc2ltaWxhcml0aWVzLCBkaWZmZXJlbmNlcywgYW5kIHJlbGF0aW9uc2hpcHMgYW1vbmcgdmFyaW91cyBtZW50YWwgY2FwYWNpdGllcy4KClRvIHRoaXMgZW5kLCBlYWNoIHBhcnRpY2lwYW50IHdhcyBlaXRoZXIgcmFuZG9tbHkgb3IgcHNldWRvLXJhbmRvbWx5IGFzc2lnbmVkIHRvIGFzc2VzcyAxLTIgdGFyZ2V0IGNoYXJhY3RlcnMgKGUuZy4sIGEgYmVldGxlLCBhIHJvYm90LCBhIGdvYXQsIGV0Yy4pIG9uIGEgd2lkZSByYW5nZSBvZiBzZW5zb3J5LCBwZXJjZXB0dWFsLCBlbW90aW9uYWwsIHNvY2lhbCwgY29nbml0aXZlLCBhbmQgb3RoZXIgbWVudGFsIGNhcGFjaXRpZXMsIHJhbmdpbmcgaW4gbnVtYmVyIGZyb20gMTgtNDAgYWNyb3NzIHN0dWRpZXMgYW5kIHByZXNlbnRlZCBpbiBlaXRoZXIgYSByYW5kb20gb3IgYSBwc2V1ZG8tcmFuZG9tIChjb3VudGVyYmFsYW5jZWQpIG9yZGVyLiBQYXJ0aWNpcGFudHMgd2VyZSBwcmVzZW50ZWQgd2l0aCBhIHZpdmlkLCBmdWxsLWNvbG9yIHBob3RvZ3JhcGggb2YgdGhlaXIgYXNzaWduZWQgdGFyZ2V0IGluIGEgbmF0dXJhbGlzdGljIGNvbnRleHQgKGUuZy4sIGEgYmVldGxlIG9uIGEgbGVhZjsgYSByb2JvdCBpbiBhbiBvZmZpY2U7IGEgZ29hdCBpbiBhIGdyYXNzeSBmaWVsZCksIHdoaWNoIHRoZXkgaGFkIGFjY2VzcyB0byB0aHJvdWdob3V0IHRoZSBzdHVkeS4gCgpPbiBlYWNoIHRyaWFsLCBwYXJ0aWNpcGFudHMgd2VyZSBhc2tlZCBhIHF1ZXN0aW9uIG9mIHRoZSBmb3JtIERvIHlvdSB0aGluayBhIFt0YXJnZXRdIGNhbiBbZG8gWF0/IChlLmcuLCAiRG8geW91IHRoaW5rIGEgYmVldGxlIGNhbiBmZWVsIGhhcHB5PyI7IFN0dWRpZXMgMS0yKSBvciBDYW4gW3RhcmdldHNdIFtkbyBYXT8gKFN0dWR5IDMpIChlLmcuLCAiQ2FuIGJlZXRsZXMgZmVlbCBoYXBweT8iKS4gUGFydGljaXBhbnRzIHJlc3BvbmRlZCBvbiBhIHRocmVlLXBvaW50IHNjYWxlIChubywgY29kZWQgYXMgMDsga2luZGEsIGNvZGVkIGFzIDAuNTsgb3IgeWVzLCBjb2RlZCBhcyAxKS4gQWx0aG91Z2ggYSB0aHJlZS1wb2ludCBzY2FsZSBpcyBub3Qgb3B0aW1hbCBmb3IgZmFjdG9yIGFuYWx5c2VzLCBwaWxvdCB0ZXN0aW5nIHN1Z2dlc3RlZCB0aGF0IGl0IHdhcyBjcml0aWNhbCBpbiBhbGxvd2luZyBjaGlsZHJlbiB0byBtb3ZlIGZhc3QgZW5vdWdoIHRocm91Z2ggdGhlIHN0dWR5IHRvIGFuc3dlciBhbGwgcXVlc3Rpb25zLCBhbmQgbWFpbnRhaW5pbmcgdGhpcyB3aXRoaW4tc3ViamVjdHMgZGVzaWduIHdhcyBvdXIgdG9wIHByaW9yaXR5IGZvciB0aGUgcGxhbm5lZCBhbmFseXNlcy4KClNlZSB0aGUgTWV0aG9kcyBzZWN0aW9uIGZvciBlYWNoIHN0dWR5IGZvciBkZXRhaWxzIG9mIHRoZSBwYXJ0aWN1bGFyIHRhcmdldCBjaGFyYWN0ZXJzIGFuZCBtZW50YWwgY2FwYWNpdGllcyBpbmNsdWRlZCBpbiBlYWNoIHN0dWR5LCBhcyB3ZWxsIGFzIHRoZSBtYXRlcmlhbHMgYW5kIHBoeXNpY2FsIHNldHVwLgoKIyMgUHJpbWFyeSBhbmFseXNpczogRXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzIChFRkEpCgpPdXIgcHJpbWFyeSBnb2FsIGluIGNvbmR1Y3RpbmcgdGhlc2Ugc3R1ZGllcyB3YXMgdG8gdW5jb3ZlciBhIHNldCBvZiBsYXRlbnQgY29uc3RydWN0cyB0aGF0IG1pZ2h0IHBsYXVzaWJseSBoYXZlIGdpdmVuIHJpc2UgdG8gdGhlIG9ic2VydmVkIGNvcnJlbGF0aW9ucyBhbW9uZyBtZW50YWwgY2FwYWNpdHkgYXR0cmlidXRpb25zIGluIGVhY2ggZ3JvdXAgb2YgcGFydGljaXBhbnRzLiBBcyBzdWNoLCBvdXIgcHJpbWFyeSBwbGFubmVkIGFuYWx5c2lzIGZvciBhbGwgc3R1ZGllcyB3YXMgYW4gZXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzIChFRkEpLiBGb2xsb3dpbmcgV2Vpc21hbiBldCBhbC4gKDIwMTcpLCB3ZSBpbnRlcnByZXRlZCBlYWNoIG9mIHRoZSBjb25zdHJ1Y3RzICgiZmFjdG9ycyIpIGFzIGNvcnJlc3BvbmRpbmcgdG8gYSBmdW5kYW1lbnRhbCBjb21wb25lbnQgb2YgbWVudGFsIGxpZmUsIGFjY29yZGluZyB0byB0aGlzIGdyb3VwIG9mIHBhcnRpY2lwYW50czsgYnkgZXh0ZW5zaW9uLCB3ZSBjb25zaWRlciB0aGUgZnVsbCBzZXQgb2YgZmFjdG9ycyBmb3IgZWFjaCBzYW1wbGUgdG8gcmVwcmVzZW50IHRvIHRoZSBvdmVyYWxsICJjb25jZXB0dWFsIHN0cnVjdHVyZSIgdW5kZXJseWluZyBtZW50YWwgY2FwYWNpdHkgYXR0cmlidXRpb25zIGZvciB0aGlzIGdyb3VwIG9mIHBhcnRpY2lwYW50cy4KCkZvciBhbGwgRUZBcywgd2UgdXNlZCBvcmRpbmFyeSBsZWFzdCBzcXVhcmVzIHRvIGZpbmQgdGhlIG1pbmltdW0gcmVzaWR1YWwgc29sdXRpb24sIHVzaW5nIHRoZSAicHN5Y2giIHBhY2thZ2UgZm9yIFIgKFJldmVsbGUsIDIwMTgpLiBIZXJlIHdlIGZvY3VzIG9uIHJlc3VsdHMgdXNpbmcgUGVhcnNvbiBjb3JyZWxhdGlvbnMgdXNpbmcgcGFpcndpc2UgY29tcGxldGUgb2JzZXJ2YXRpb25zLiAoU2VlIE9ubGluZSBTdXBwbGVtZW50YXJ5IE1hdGVyaWFscyBbT1NNXSBmb3Igc29sdXRpb25zIHVzaW5nIHBvbHljaG9yaWMgY29ycmVsYXRpb25zLCB3aGljaCBhcmUgYmV0dGVyIHN1aXRlZCB0byBoYW5kbGUgcmVzcG9uc2VzIG9uIGEgdGhyZWUtcG9pbnQgc2NhbGUgYnV0LCB0byBvdXIgZXllcywgdGVuZGVkIHRvIG92ZXItZml0IG91ciBkYXRhIGJ5IHN1Z2dlc3RpbmcgdGhhdCB3ZSBzaG91bGQgcmV0YWluIG1hbnkgZmFjdG9ycyB0aGF0IGVhY2ggYWNjb3VudGVkIGZvciBvbmx5IGEgc21hbGwgYW1vdW50IG9mIHRoZSBzaGFyZWQgdmFyaWFuY2UuKQoKSW4gb3JkZXIgdG8gZGV0ZXJtaW5lIGhvdyBtYW55IGZhY3RvcnMgdG8gcmV0YWluLCB3ZSBleGFtaW5lZCB0aGUgcmVzdWx0cyBvZiB0aHJlZSBmYWN0b3IgcmV0ZW50aW9uIHByb3RvY29sczogKDEpIFBhcmFsbGVsIEFuYWx5c2lzLCB3aGljaCBjb21wYXJlcyB0aGUgb2JzZXJ2ZWQgY29ycmVsYXRpb24gc3RydWN0dXJlIHRvIHRoZSBjb3JyZWxhdGlvbiBzdHJ1Y3R1cmUgYXJpc2luZyBmcm9tIHJhbmRvbSBkYXRhc2V0cyBvZiB0aGUgc2FtZSBzaXplOyAoMikgTWluaW1pemluZyB0aGUgQmF5ZXNpYW4gSW5mb3JtYXRpb24gQ3JpdGVyaW9uIChCSUMpLCB3aGljaCBpcyBvbmUgbWV0aG9kIG9mIG9wdGltaXppbmcgYm90aCBnb29kbmVzcyBvZiBmaXQgYW5kIHBhcnNpbW9ueTsgYW5kICgzKSBBIHNldCBvZiBmYWN0b3IgcmV0ZW50aW9uIGNyaXRlcmlhIHRoYXQgaGF2ZSBiZWVuIHVzZWQgaW4gV2Vpc21hbiBldCBhbC4ncyAoMjAxNykgcHJldmlvdXMgd29yaywgaW4gd2hpY2ggdGhleSBiZWdhbiB3aXRoIHRoZSBtYXhpbWFsIG51bWJlciBvZiBmYWN0b3JzIGFjY29yZGluZyB0byBhbiBhbmFseXNpcyBvZiBkZWdyZWVzIG9mIGZyZWVkb20sIGFuZCByZXRhaW5lZCBmYWN0b3JzIHRoYXQgbWV0IGFsbCB0aHJlZSBvZiB0aGUgZm9sbG93aW5nIGNyaXRlcmlhOiAoYSkgaGFkIGVpZ2VudmFsdWVzIGdyZWF0ZXIgdGhhbiAxLjAwLCAoYikgaW5kaXZpZHVhbGx5IGFjY291bnRlZCBmb3IgZ3JlYXRlciB0aGFuIDUlIG9mIHRoZSBzaGFyZWQgdmFyaWFuY2UgYmVmb3JlIHJvdGF0aW9uLCBhbmQgKGMpIHdlcmUgdGhlICJkb21pbmFudCIgZmFjdG9yICh0aGUgZmFjdG9yIHdpdGggdGhlIHN0cm9uZ2VzdCBhYnNvbHV0ZSBmYWN0b3IgbG9hZGluZykgZm9yIGF0IGxlYXN0IDEgbWVudGFsIGNhcGFjaXR5IGFmdGVyIHJvdGF0aW9uLiBGb3IgZWFjaCBzdHVkeSwgb3VyIGludGVycHJldGF0aW9uIG9mIGhvdyBiZXN0IHRvIGNoYXJhY3Rlcml6ZSB0aGUgZGF0YXNldCAoaS5lLiwgaG93IG1hbnkgZmFjdG9ycyB3ZSBvYnNlcnZlKSB3YXMgZGV0ZXJtaW5lZCBieSB0aGUgZGVncmVlIG9mIGNvbnNlbnN1cyBhbW9uZyB0aGVzZSB0aHJlZSBwcm90b2NvbHMgYW5kIHRoZSBpbnRlcnByZXRhYmlsaXR5IG9mIHRoZSByZXRhaW5lZCBmYWN0b3JzIHVuZGVyIGVhY2ggcHJvdG9jb2wuIAoKSGVyZSB3ZSBmb2N1cyBvdXIgaW50ZXJwcmV0YXRpb25zIG9uIHZhcmltYXgtcm90YXRlZCBzb2x1dGlvbnMsIHdoaWNoIGNvbnN0cmFpbiBhbGwgZmFjdG9ycyB0byBiZSBvcnRob2dvbmFsLiAoU2VlIE9TTSBmb3Igc29sdXRpb25zIHVzaW5nIG9ibGlxdWUgWyJvYmxpbWluIl0gcm90YXRpb25zLCB3aGljaCBhbGxvdyBmb3IgY29ycmVsYXRlZCBmYWN0b3JzLikKCiMjIFNlY29uZGFyeSBhbmFseXNpczogUmVncmVzc2lvbiBhbmFseXNlcyBvZiBmYWN0b3Igc2NvcmVzCgpIYXZpbmcgaW5mZXJyZWQgYSBjb25jZXB0dWFsIHN0cnVjdHVyZSBmb3IgYSBnaXZlbiBncm91cCBvZiBwYXJ0aWNpcGFudHMgdmlhIEVGQSwgd2UgdGhlbiBzb3VnaHQgdG8gZXhhbWluZSBhdHRyaWJ1dGlvbnMgb2YgbWVudGFsIGNhcGFjaXRpZXMgdG8gdGhlIHBhcnRpY3VsYXIgdGFyZ2V0IGNoYXJhY3RlcnMgaW5jbHVkZWQgaW4gZWFjaCBzdHVkeSB3aXRoaW4gdGhpcyBjb25jZXB0dWFsIHN0cnVjdHVyZTogVG8gd2hhdCBleHRlbnQgZGlkIHBhcnRpY2lwYW50cyBhdHRyaWJ1dGUgZWFjaCBvZiB0aGUgZnVuZGFtZW50YWwgY29tcG9uZW50cyBvZiBtZW50YWwgbGlmZSByZXZlYWxlZCBieSBFRkEgdG8gYSBnaXZlbiB0YXJnZXQgY2hhcmFjdGVyLCBhbmQgaG93IGRpZCB0aGlzIGF0dHJpYnV0aW9ucyB2YXJ5IHdpdGggYWdlIChlaXRoZXIgd2l0aGluIGFuIGFnZSBncm91cCBvciBiZXR3ZWVuIGFnZSBncm91cHMpPyBUbyBleHBsb3JlIHRoaXMgcXVlc3Rpb24sIHdlIGV4YW1pbmVkICJmYWN0b3Igc2NvcmVzIuKAlHN1bW1hcmllcyBvZiBlYWNoIHBhcnRpY2lwYW50J3MgYXR0cmlidXRpb25zIG9mIGVhY2ggb2YgZmFjdG9ycyByZXZlYWxlZCBieSBFRkEuIFdlIHVzZWQgdGhlIGNvcnJlbGF0aW9uLXByZXNlcnZpbmcgInRlbiBCZXJnZSIgbWV0aG9kIChhcyBpbXBsZW1lbnRlZCBpbiB0aGUgInBzeWNoIiBwYWNrYWdlOyBSZXZlbGxlLCAyMDE4KSwgaW1wdXRpbmcgbWlzc2luZyB2YWx1ZXMgdXNpbmcgdGhlIG1lYW4gKGJ5IHRhcmdldCBjaGFyYWN0ZXIsIGNhcGFjaXR5LCBhbmQgYWdlIGdyb3VwKS4gVGhpcyB5aWVsZGVkIG9uZSBmYWN0b3Igc2NvcmUgZm9yIGVhY2ggb2YgdGhlIGZhY3RvcnMgcmV2ZWFsZWQgYnkgRUZBIGZvciBlYWNoIHBhcnRpY2lwYW50LgoKV2UgYW5hbHl6ZWQgdGhlc2UgZmFjdG9yIHNjb3JlcyB2aWEgbWl4ZWQgZWZmZWN0cyBCYXllc2lhbiByZWdyZXNzaW9uIGFuYWx5c2VzIHVzaW5nIHRoZSAiYnJtcyIgcGFja2FnZSBmb3IgUiAoQsO8cmtuZXIsIDIwMTcpLiBJbiBhbGwgb2YgdGhlc2UgYW5hbHlzZXMsIHdlIGluY2x1ZGVkIHRoZSBtYXhpbWFsIHJhbmRvbSBlZmZlY3Qgc3RydWN0dXJlcyBnaXZlbiB0aGUgZGVzaWduIGZvciB0aGUgcmVsZXZhbnQgc3R1ZHkuIEZ1cnRoZXIgZGV0YWlscyB2YXJpZWQgYnkgc3R1ZHksIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIHRhcmdldCBjaGFyYWN0ZXJzIGluY2x1ZGVkIGluIHRoYXQgc3R1ZHksIHRoZSBudW1iZXIgb2YgZmFjdG9ycyByZXZlYWxlZCBieSBFRkEgZm9yIHRoZSByZWxldmFudCBncm91cChzKSBvZiBwYXJ0aWNpcGFudHMsIGFuZCB0aGUgZ29hbHMgb2YgdGhlIGFuYWx5c2lzIChlLmcuLCBjb21wYXJpbmcgdHdvIGFnZSBncm91cHMgdnMuIGV4YW1pbmluZyBjb250aW51b3VzIGVmZmVjdHMgb2YgYWdlIHdpdGhpbiBvbmUgb3IgbW9yZSBncm91cHMgb2YgcGFydGljaXBhbnRzKS4KCiMgU3R1ZHkgMQoKVGhlIGdvYWwgb2YgU3R1ZHkgMSB3YXMgdG8gZGV2ZWxvcCBhIGNoaWxkLWZyaWVuZGx5IHZlcnNpb24gb2YgV2Vpc21hbiBldCBhbC4ncyAoMjAxNykgc3R1ZHkgcGFyYWRpZ20gYW5kIGNvbmR1Y3QgYW4gaW5pdGlhbCBleHBsb3JhdGlvbiBvZiB0aGlzIGNvbmNlcHR1YWwgc3RydWN0dXJlIGFtb25nIGNoaWxkcmVuLiAKClBpbG90IHRlc3Rpbmcgc3VnZ2VzdGVkIHRoYXQgY2hpbGRyZW4gYXMgeW91bmcgYXMgNyB5ZWFycyBvZiBhZ2UgZm91bmQgdGhlIHBhcmFkaWdtIGVhc3kgYW5kIGVuam95YWJsZSwgYW5kIHdvcmsgb24gdGhlIGRldmVsb3BtZW50IG9mIGxheSBiaW9sb2d5IGFuZCBwc3ljaG9sb2d5IGhhcyBzdWdnZXN0ZWQgdGhhdCB0aGVzZSBjb25jZXB0cyBtYXkgY29udGludWUgdG8gZGV2ZWxvcCB3ZWxsIGludG8gbWlkZGxlIGNoaWxkaG9vZCAoZS5nLiwgQ2FyZXksIDE5ODU7IEhhdGFubyAmIEluYWdha2ksIDE5OTc7IFBpYWdldCwgMTkyOTsgY2YuIEdlbG1hbiAmIE9wZmVyLCAyMDAyKS4gVGh1cywgd2UgdGFyZ2V0ZWQgNy0gdG8gOS15ZWFyLW9sZCBjaGlsZHJlbiBmb3Igb3VyIGZpcnN0IGNoaWxkIHNhbXBsZS4gV2UgYWxzbyByZWNydWl0ZWQgYSBncm91cCBvZiBhZHVsdHMgdG8gdmFsaWRhdGUgb3VyIGNoaWxkLSBmcmllbmRseSBwYXJhZGlnbSwgaS5lLiwgdG8gZXZhbHVhdGUgd2hldGhlciBpdCByZXBsaWNhdGVkIFdlaXNtYW4gZXQgYWwuJ3MgKDIwMTcpIG9yaWdpbmFsIHdvcmsgd2l0aCBhZHVsdHMuCkluIFdlaXNtYW4gZXQgYWwuJ3MgKDIwMTcpIG9yaWdpbmFsIHN0dWRpZXMsIHBhcnRpY2lwYW50cyBldmFsdWF0ZWQgYSB0YXJnZXQgY2hhcmFjdGVyIG9uIDQwIG1lbnRhbCBjYXBhY2l0aWVzIHVzaW5nIGEgc2V2ZW4tcG9pbnQgTGlrZXJ0LXR5cGUgc2NhbGUuIFBpbG90IHRlc3Rpbmcgc3VnZ2VzdGVkIHR3byBuZWNlc3NhcnkgbW9kaWZpY2F0aW9ucyBmb3IgY2hpbGRyZW46IHJld29yZGluZyBzb21lIG9mIHRoZSBtZW50YWwgY2FwYWNpdHkgaXRlbXMsIGFuZCB1c2luZyBhIHNpbXBsZXIsIHRocmVlLXBvaW50IHJlc3BvbnNlIHNjYWxlIChubywga2luZGEsIG9yIHllczsgc2VlICJPdmVydmlldyBvZiBNZXRob2RzIGFuZCBBbmFseXNlcywgYWJvdmUiKS4gCgojIyBNZXRob2QKCiMjIyBQYXJ0aWNpcGFudHMKCmByIG5yb3coZDFfYWRfd2lkZSkgKyBucm93KGQxXzc5X3dpZGUpYCBwZW9wbGUgcGFydGljaXBhdGVkIGluIHRoaXMgc3R1ZHkuCgpgYGB7cn0KIyBkZW1vZ3JhcGhpY3MKZDFfYWRfZ2VuZGVyIDwtIGRlbW9fZnVuKGQxX2FkLCAiZ2VuZGVyIiwgMikKZDFfYWRfZXRobmljaXR5IDwtIGRlbW9fZnVuKGQxX2FkLCAiZXRobmljaXR5X2NhdCIsIDIpCmQxX2FkX2VuZ2xpc2ggPC0gZGVtb19mdW4oZDFfYWQsICJlbmdsaXNoTmF0aXZlIiwgMikKYGBgCgpBZHVsdHMgKF9uXz1gciBucm93KGQxX2FkX3dpZGUpYCkgcGFydGljaXBhdGVkIHZpYSBBbWF6b24gTWVjaGFuaWNhbCBUdXJrIChNVHVyaykgaW4gSnVseSAyMDE2LiBBZHVsdCBwYXJ0aWNpcGFudHMgaGFkIGdhaW5lZCBhcHByb3ZhbCBmb3IgYXQgbGVhc3QgOTUlIG9mIHRoZWlyIHByZXZpb3VzIHdvcmsgb24gTVR1cms7IGhhZCBNVHVyayBhY2NvdW50cyBiYXNlZCBpbiB0aGUgVVM7IGFuZCBpbmRpY2F0ZWQgdGhhdCB0aGV5IHdlcmUgYXQgbGVhc3QgMTggeWVhcnMgb2xkLiBBZHVsdHMgd2VyZSBwYWlkIFwkMC4zMCBmb3IgYXBwcm94aW1hdGVseSAyLTMgbWludXRlcyBvZiB0aGVpciB0aW1lIChtZWRpYW4gZHVyYXRpb246IGByIHN1bW1hcnkoZDFfYWQkZHVyYXRpb24pWyJNZWRpYW4iXSAlPiUgcm91bmQoMilgIG1pbikuIAoKQWNjb3JkaW5nIHRvIHNlbGYgcmVwb3J0LCB0aGUgYWR1bHQgc2FtcGxlIHJhbmdlZCBpbiBhZ2UgZnJvbSBgciBzdW1tYXJ5KGQxX2FkJGFnZSlbIk1pbi4iXWAtYHIgc3VtbWFyeShkMV9hZCRhZ2UpWyJNYXguIl1gIHllYXJzIChtZWRpYW46IGByIHN1bW1hcnkoZDFfYWQkYWdlKVsiTWVkaWFuIl1geSkgYW5kIHdhcyByb3VnaGx5IHNwbGl0IGJldHdlZW4gd29tZW4gKGByIGQxX2FkX2dlbmRlciRwcm9wW2QxX2FkX2dlbmRlciRnZW5kZXI9PSJmZW1hbGUiXSAqIDEwMGAlKSBhbmQgbWVuIChgciBkMV9hZF9nZW5kZXIkcHJvcFtkMV9hZF9nZW5kZXIkZ2VuZGVyPT0ibWFsZSJdICogMTAwYCU7IGByIGQxX2FkX2dlbmRlciRwcm9wW2QxX2FkX2dlbmRlciRnZW5kZXI9PSJvdGhlcl9wcmVmTm8iXSAqIDEwMGAlIG9mIHBhcnRpY2lwYW50cyBpZGVudGlmaWVkIGFzIHNvbWUgb3RoZXIgZ2VuZGVyIG9yIG9wdGVkIG5vdCB0byBkaXNjbG9zZSkuIEFkdWx0cyBwcmVkb21pbmFudGx5IGlkZW50aWZpZWQgYXMgV2hpdGUgKGByIGQxX2FkX2V0aG5pY2l0eSRwcm9wW2QxX2FkX2V0aG5pY2l0eSRldGhuaWNpdHlfY2F0PT0id2hpdGUiXSAqIDEwMGAlOyBgciBkMV9hZF9ldGhuaWNpdHkkcHJvcFtkMV9hZF9ldGhuaWNpdHkkZXRobmljaXR5X2NhdD09Im11bHRpIl0gKiAxMDBgJSBpZGVudGlmaWVkIGFzIG1vcmUgdGhhbiBvbmUgcmFjZS9ldGhuaWNpdHksIGFuZCAkXGxlcSQgYHIgZGF0YS5mcmFtZShkMV9hZF9ldGhuaWNpdHkgJT4lIGZpbHRlcighZXRobmljaXR5X2NhdCAlaW4lIGMoIndoaXRlIiwgIm11bHRpIikpKSRwcm9wICU+JSBtYXgoKSAqIDEwMGAlIGFzIGFueSBvdGhlciByYWNlL2V0aG5pY2l0eSkuIFRoZSB2YXN0IG1ham9yaXR5IG9mIGFkdWx0cyByZXBvcnRlZCBFbmdsaXNoIGJlaW5nIHRoZWlyIG9ubHkgbmF0aXZlIGxhbmd1YWdlIChgciBkMV9hZF9lbmdsaXNoJHByb3BbZDFfYWRfZW5nbGlzaCRlbmdsaXNoTmF0aXZlID09ICJ5ZXNfb25seSJdICogMTAwYCU7IGFuIGFkZGl0aW9uYWwgYHIgZDFfYWRfZW5nbGlzaCRwcm9wW2QxX2FkX2VuZ2xpc2gkZW5nbGlzaE5hdGl2ZSA9PSAieWVzX211bHRpcGxlIl0gKiAxMDBgJSBpbmRpY2F0ZWQgdGhhdCBFbmdsaXNoIHdhcyBvbmUgb2YgbXVsdGlwbGUgbmF0aXZlIGxhbmd1YWdlcyBmb3IgdGhlbS4pCgpgYGB7cn0KIyBkZW1vZ3JhcGhpY3MKZDFfNzlfZ2VuZGVyIDwtIGRlbW9fZnVuKGQxXzc5LCAiZ2VuZGVyIiwgMikKZDFfNzlfZXRobmljaXR5IDwtIGRlbW9fZnVuKGQxXzc5LCAiZXRobmljaXR5IiwgMikKZDFfNzlfYmlsaW5ndWFsIDwtIGRlbW9fZnVuKGQxXzc5LCAiYmlsaW5ndWFsIiwgMikKYGBgCgpDaGlsZHJlbiAoX25fPWByIG5yb3coZDFfNzlfd2lkZSlgKSBwYXJ0aWNpcGF0ZWQgYXQgb25lIG9mIHNldmVyYWwgU2FuIEZyYW5jaXNjbyBCYXkgQXJlYSBtdXNldW1zIG9yIGF0IHRoZWlyIHlvdW5nZXIgc2libGluZydzIHByZXNjaG9vbCBiZXR3ZWVuIEp1bHktRGVjZW1iZXIgMjAxNi4gVGhlIHN0dWR5IHRvb2sgbW9zdCBjaGlsZHJlbiB1bmRlciAxMCBtaW51dGVzIHRvIGNvbXBsZXRlIChtZWRpYW4gZHVyYXRpb246IGByIHN1bW1hcnkoZDFfNzkkZHVyYXRpb24pWyJNZWRpYW4iXSAlPiUgcm91bmQoMilgIG1pbikuIEFuIGFkZGl0aW9uYWwgMTIgY2hpbGRyZW4gcGFydGljaXBhdGVkIGJ1dCB3ZXJlIGV4Y2x1ZGVkIGZvciBiZWluZyBvdXRzaWRlIHRoZSB0YXJnZXQgYWdlIHJhbmdlIChfbl89NyksIGJlaW5nIG9mIHVua25vd24gYWdlIChfbl89NCksIG9yIGJlaW5nIHNob3duIGEgdGFyZ2V0IGNoYXJhY3RlciBvdGhlciB0aGFuIGEgYmVldGxlIG9yIGEgcm9ib3QgKF9uXz0xKS4gQ2hpbGRyZW4gcmVjZWl2ZWQgYSBzbWFsbCB0aGFuay15b3UgZ2lmdCAoZS5nLiwgYSBzdGlja2VyKSBmb3IgdGhlaXIgcGFydGljaXBhdGlvbi4gCgpDaGlsZHJlbiByYW5nZWQgaW4gYWdlIGZyb20gYHIgc3VtbWFyeShkMV83OSRhZ2UpWyJNaW4uIl0gJT4lIHJvdW5kKDIpYC1gciBzdW1tYXJ5KGQxXzc5JGFnZSlbIk1heC4iXSAlPiUgcm91bmQoMilgIHllYXJzIChtZWRpYW46IGByIHN1bW1hcnkoZDFfNzkkYWdlKVsiTWVkaWFuIl0gJT4lIHJvdW5kKDIpYHkpLiBBY2NvcmRpbmcgdG8gcGFyZW50YWwgcmVwb3J0LCB0aGUgY2hpbGQgc2FtcGxlIGluY2x1ZGVkIHNsaWdodGx5IG1vcmUgZ2lybHMgKGByIGQxXzc5X2dlbmRlciRwcm9wW2QxXzc5X2dlbmRlciRnZW5kZXI9PSJmIl0gKiAxMDBgJSkgdGhhbiBib3lzIChgciBkMV83OV9nZW5kZXIkcHJvcFtkMV83OV9nZW5kZXIkZ2VuZGVyPT0ibSJdICogMTAwYCU7IGByIGQxXzc5X2dlbmRlciRwcm9wW2QxXzc5X2dlbmRlciRnZW5kZXI9PSJNSVNTSU5HIl0gKiAxMDBgJSBvZiBjaGlsZHJlbidzIGdlbmRlciB3YXMgbm9uLWJpbmFyeSBvciB1bmtub3duKS4gUGFyZW50cyBwcmVkb21pbmFudGx5IGlkZW50aWZpZWQgdGhlaXIgY2hpbGRyZW4gYXMgV2hpdGUgKGByIGQxXzc5X2V0aG5pY2l0eSRwcm9wW2QxXzc5X2V0aG5pY2l0eSRldGhuaWNpdHk9PSJ3aGl0ZSJdICogMTAwYCUpLCBtdWx0aXJhY2lhbCAoYHIgZDFfNzlfZXRobmljaXR5JHByb3BbZDFfNzlfZXRobmljaXR5JGV0aG5pY2l0eT09Im11bHRpIl0gKiAxMDBgJSksIEVhc3QgQXNpYW4gKGByIGQxXzc5X2V0aG5pY2l0eSRwcm9wW2QxXzc5X2V0aG5pY2l0eSRldGhuaWNpdHk9PSJlYXN0IGFzaWFuIl0gKiAxMDBgJSksIG9yIFNvdXRoIEFzaWFuIChgciBkMV83OV9ldGhuaWNpdHkkcHJvcFtkMV83OV9ldGhuaWNpdHkkZXRobmljaXR5PT0ic291dGggb3Igc291dGhlYXN0IGFzaWFuIl0gKiAxMDBgJTsgJFxsZXEkIGByIGRhdGEuZnJhbWUoZDFfNzlfZXRobmljaXR5ICU+JSBmaWx0ZXIoIWV0aG5pY2l0eSAlaW4lIGMoIndoaXRlIiwgIm11bHRpIiwgImVhc3QgYXNpYW4iLCAic291dGggb3Igc291dGhlYXN0IGFzaWFuIiwgIk1JU1NJTkciKSkpJHByb3AgJT4lIG1heCgpICogMTAwYCUgb2YgY2hpbGRyZW4gd2VyZSBpZGVudGlmaWVkIGFzIGFueSBvdGhlciByYWNlL2V0aG5pY2l0eSwgYW5kIGByIGQxXzc5X2V0aG5pY2l0eSRwcm9wW2QxXzc5X2V0aG5pY2l0eSRldGhuaWNpdHk9PSJNSVNTSU5HIl0gKiAxMDBgJSBvZiBjaGlsZHJlbidzIHJhY2UvZXRobmljaXR5IHdhcyB1bmtub3duKS4gUm91Z2hseSBoYWxmIG9mIHBhcmVudHMgKGByIGQxXzc5X2JpbGluZ3VhbCRwcm9wW2QxXzc5X2JpbGluZ3VhbCRiaWxpbmd1YWw9PSJ5ZXMiXSAqIDEwMGAlKSByZXBvcnRlZCB0aGF0IHRoZWlyIGNoaWxkIHdhcyBiaWxpbmd1YWwgKHRob3VnaCwgYW5lY2RvdGFsbHksIHBhcmVudHMnIGludGVycHJldGF0aW9ucyBvZiAiYmlsaW5ndWFsIiByYW5nZWQgZnJvbSB0YWtpbmcgY2xhc3NlcyBhdCBzY2hvb2wgdG8gc3BlYWtpbmcgYSBsYW5nYXVnZSBhdCBob21lKS4KCiMjIyBNYXRlcmlhbHMgYW5kIHByb2NlZHVyZQoKRm9sbG93aW5nIFdlaXNtYW4gZXQgYWwuICgyMDE3LCBTdHVkaWVzIDEtMyksIHBhcnRpY2lwYW50cyB3ZXJlIHJhbmRvbWx5IGFzc2lnbmVkIHRvIGFzc2VzcyB0aGUgbWVudGFsIGNhcGFjaXRpZXMgb2Ygb25lIG9mIHR3byAiZWRnZSBjYXNlcyIgaW4gc29jaWFsIHJlYXNvbmluZzogYSBiZWV0bGUgKF9uXz1gciBkMV9hZCAlPiUgZmlsdGVyKGNoYXJhY3RlciA9PSAiYmVldGxlIikgJT4lIGRpc3RpbmN0KHN1YmlkKSAlPiUgbnJvdygpYCBhZHVsdHMsIF9uXz1gciBkMV83OSAlPiUgZmlsdGVyKGNoYXJhY3RlciA9PSAiYmVldGxlIikgJT4lIGRpc3RpbmN0KHN1YmlkKSAlPiUgbnJvdygpYCBjaGlsZHJlbikgb3IgYSByb2JvdCAoX25fPWByIGQxX2FkICU+JSBmaWx0ZXIoY2hhcmFjdGVyID09ICJyb2JvdCIpICU+JSBkaXN0aW5jdChzdWJpZCkgJT4lIG5yb3coKWAgYWR1bHRzLCBfbl89YHIgZDFfNzkgJT4lIGZpbHRlcihjaGFyYWN0ZXIgPT0gInJvYm90IikgJT4lIGRpc3RpbmN0KHN1YmlkKSAlPiUgbnJvdygpYCBjaGlsZHJlbikuIEJlY2F1c2UgYmVldGxlcyBhcmUgYW5pbWFscyBhbmQgcm9ib3RzIGFyZSBhcnRpZmFjdHMsIHRoaXMgcGFpciBwcm92aWRlcyBpbnNpZ2h0IGludG8gdGhlIHJvbGUgb2YgYmlvbG9naWNhbCBsaWZlIGluIGF0dHJpYnV0aW9ucyBvZiBtZW50YWwgbGlmZeKAlGFuIGlzc3VlIG9mIHBhcnRpY3VsYXIgaW50ZXJlc3QgZnJvbSBhIGRldmVsb3BtZW50YWwgcGVyc3BlY3RpdmUsIGdpdmVuIHRoZSBsb25nIGhpc3Rvcnkgb2Ygd29yayBvbiB0aGUgZGV2ZWxvcG1lbnQgb2YgdGhlIGFuaW1hdGUtaW5hbmltYXRlIGRpc3RpbmN0aW9uIGFuZCBpdHMgcmVsYXRpb24gdG8gZm9sayBwc3ljaG9sb2d5LiBNb3N0IGNyaXRpY2FsbHkgZm9yIG91ciBib3R0b20tdXAgYXBwcm9hY2ggdG8gdW5jb3ZlcmluZyBjb25jZXB0dWFsIHN0cnVjdHVyZSwgdGhlICJtZW50YWwgbGl2ZXMiIG9mIHRoZXNlIGVudGl0aWVzIGFyZSBjb250cm92ZXJzaWFsOiBQZW9wbGUgZGlmZmVyIGluIHRoZWlyIGFzc2Vzc21lbnRzIG9mIHRoZSBtZW50YWwgY2FwYWNpdGllcyBvZiBiZWV0bGVzIGFuZCByb2JvdHMuIFRoaXMgYWxsb3dlZCB1cyB0byBhZGRyZXNzIHRoZSBmb2xsb3dpbmcgcXVlc3Rpb246IFdoZW4gcGFydGljaXBhbnRzIGRpc2FncmVlIGFib3V0IHRoZSBtZW50YWwgY2FwYWNpdGllcyBvZiBzb21lIGVudGl0eSwgd2hpY2ggY2FwYWNpdGllcyAiZ28gdG9nZXRoZXIiPwoKSW5zdHJ1Y3Rpb25zIHRvIHBhcnRpY2lwYW50cyBmb2N1c2VkIG9uIHRoZSBpZGVhIHRoYXQgd2Ugd2FudGVkIHRvIGtub3cgd2hhdCBwYXJ0aWNpcGFudHMgdGhvdWdodCAiW2JlZXRsZXMvcm9ib3RzXSBjYW4gZG8gYW5kIGNhbiBub3QgZG8uIiBQYXJ0aWNpcGFudHMgcmF0ZWQgdGhlIHRhcmdldCBjaGFyYWN0ZXIgb24gNDAgbWVudGFsIGNhcGFjaXRpZXMsIHByZXNlbnRlZCBpbiBhIHJhbmRvbSBvcmRlciBmb3IgZWFjaCBwYXJ0aWNpcGFudC4gT24gZWFjaCB0cmlhbCwgcGFydGljaXBhbnRzIHJlc3BvbmRlZCBfbm9fLCBfa2luZGFfLCBvciBfeWVzXyB0byB0aGUgcXVlc3Rpb24gIkRvIHlvdSB0aGluayBhIFtiZWV0bGUvcm9ib3RdIGNhbi4uLj8iIFRoZSB0aHJlZSByZXNwb25zZSBvcHRpb25zIHdlcmUgdmlzaWJsZSB0aHJvdWdob3V0IHRoZSBleHBlcmltZW50LgoKVGhlIDQwIG1lbnRhbCBjYXBhY2l0aWVzIHdlcmUgZGVzaWduZWQgdG8gYmUgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gdGhvc2UgaW4gV2Vpc21hbiBldCBhbC4ncyAoMjAxNykgb3JpZ2luYWwgc3R1ZGllcywgd2hpbGUgYmVpbmcgY29tcHJlaGVuc2libGUgdG8gY2hpbGRyZW4gaW4gZWFybHkgZWxlbWVudGFyeSBzY2hvb2wuIFRoaXMgc2V0IG9mIGl0ZW1zIGluY2x1ZGVkIHBoeXNpb2xvZ2ljYWwgc2Vuc2F0aW9ucyByZWxhdGVkIHRvIGJpb2xvZ2ljYWwgbmVlZHMgKGUuZy4sIF9nZXQgaHVuZ3J5Xyk7IGVtb3Rpb25hbCBleHBlcmllbmNlcyAoZS5nLiwgX2ZlZWwgaGFwcHlfKTsgcGVyY2VwdHVhbCBhYmlsaXRpZXMgKGUuZy4sIF9oZWFyIHNvdW5kc18pOyBjb2duaXRpdmUgYWJpbGl0aWVzIChlLmcuLCBfcmVtZW1iZXIgdGhpbmdzXyk7IGNhcGFjaXRpZXMgcmVsYXRlZCB0byBhdXRvbm9teSBvciBhZ2VuY3kgKGUuZy4sIF9kZWNpZGUgd2hhdCB0byBkb18pOyBzb2NpYWwgYWJpbGl0aWVzIChlLmcuLCBfZmVlbCBndWlsdHlfKTsgYW5kIHNldmVyYWwgYWRkaXRpb25hbCBpdGVtcyAoZS5nLiwgX2JlIGF3YXJlIG9mIGl0c2VsZl8pLiBFYWNoIG9mIHRoZXNlIGEgcHJpb3JpIGNhdGVnb3JpZXMgaW5jbHVkZWQgYXQgbGVhc3QgZml2ZSBpdGVtcyBvZiB2YXJ5aW5nIHZhbGVuY2UsIGNvbXBsZXhpdHksIGFuZCBwaHJhc2luZy4gKFNlZSBGaWd1cmUgMSBmb3IgdGhlIGZ1bGwgbGlzdCBvZiBtZW50YWwgY2FwYWNpdGllcyBpbmNsdWRlZCBpbiBTdHVkeSAxLikKCldlIGFsc28gcHJlcGFyZWQgYSBzaG9ydCBkZWZpbml0aW9uIGZvciBlYWNoIGl0ZW0sIHNvIGFzIHRvIGJlIGNvbnNpc3RlbnQgaW4gb3VyIHJlc3BvbnNlcyB0byBwYXJ0aWNpcGFudHMgKHBhcnRpY3VsYXJseSBjaGlsZHJlbikgaWYgdGhleSBhc2tlZCBmb3IgY2xhcmlmaWNhdGlvbiAoc2VlIFNPTSkuIENoaWxkcmVuIHdlcmUgZW5jb3VyYWdlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHVkeSB0byBhc2sgcXVlc3Rpb25zIGlmIHRoZXkgZGlkIG5vdCBrbm93IHdoYXQgYSB3b3JkIG1lYW50LCBpbiB3aGljaCBjYXNlIHRoZXkgZ2l2ZW4gdGhlc2UgZGVmaW5pdGlvbnM7IGFkdWx0cyB3ZXJlIHRvbGQgdGhhdCB0aGV5IGNvdWxkIGFjY2VzcyB0aGVzZSBkZWZpbml0aW9ucyBieSBob3ZlcmluZyBvdmVyIHRoZSB0ZXh0IG9uIHRoZSBjb21wdXRlciBzY3JlZW4uIFBpbG90IHRlc3Rpbmcgc3VnZ2VzdGVkIHRoYXQgc2V2ZW4gaXRlbXMgcmVxdWlyZWQgY2xhcmlmaWNhdGlvbiBmb3IgbW9zdCBjaGlsZHJlbiwgc28gdGhlc2UgaXRlbXMgd2VyZSBhbHdheXMgYWNjb21wYW5pZWQgYnkgdGhlaXIgZGVmaW5pdGlvbnMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0cmlhbCAoZm9yIGJvdGggYWR1bHRzIGFuZCBjaGlsZHJlbiksIGFzIGZvbGxvd3M6IF9oYXZlIGEgcGVyc29uYWxpdHksIGxpa2Ugd2hlbiBzb21lb25lIGlzIHNoeSBhbmQgc29tZWJvZHkgZWxzZSBpcyBzaWxseV87IF9oYXZlIGJlbGllZnMsIGxpa2Ugd2hlbiB5b3UgdGhpbmsgc29tZXRoaW5nIGlzIHRydWVfOyBfZmVlbCBwbGVhc3VyZSwgbGlrZSB3aGVuIHNvbWV0aGluZyBmZWVscyByZWFsbHkgZ29vZF87IF9oYXZlIGRlc2lyZXMsIGxpa2Ugd2hlbiB5b3UgcmVhbGx5IHdhbnQgc29tZXRoaW5nXzsgX2hhdmUgc2VsZi0gY29udHJvbCwgbGlrZSB3aGVuIHlvdSBzdG9wIHlvdXJzZWxmIGZyb20gZG9pbmcgc29tZXRoaW5nIHlvdSBzaG91bGRuJ3QgZG9fOyBfaGF2ZSBnb2FscywgbGlrZSB3aGVuIHlvdSdyZSB0cnlpbmcgaGFyZCB0byBkbyBzb21ldGhpbmcgb3IgbWFrZSBzb21ldGhpbmcgaGFwcGVuXzsgYW5kIF9mZWVsIHNpY2ssIGxpa2Ugd2hlbiB5b3UgZmVlbCBsaWtlIHlvdSBtaWdodCB0aHJvdyB1cF8uIAoKQWR1bHRzIGNvbXBsZXRlZCB0aGUgc3R1ZHkgYnkgY2xpY2tpbmcgdGhyb3VnaCBhIHdlYnNpdGUgYXQgdGhlaXIgb3duIHBhY2UsIHdpdGggb25lIHRyaWFsIHByZXNlbnRlZCBvbiBlYWNoIHBhZ2UgYW5kIG5vIGFiaWxpdHkgdG8gZ28gYmFja3dhcmRzLiBDaGlsZHJlbiBjb21wbGV0ZWQgdGhlIHN0dWR5IG9uIGFuIGV4cGVyaW1lbnRlcidzIGxhcHRvcCBjb21wdXRlci4gVGhlIGV4cGVyaW1lbnRlciByZWFkIHRoZSBpbnN0cnVjdGlvbnMgYW5kIHRoZSBmaXJzdCBzZXZlcmFsIHRyaWFscyBvdXQgbG91ZCwgcmVxdWVzdGluZyB2ZXJiYWwgcmVzcG9uc2VzIGZyb20gdGhlIGNoaWxkIGFuZCBzZWxlY3RlZCBoaXMgb3IgaGVyIHJlc3BvbnNlIGZvciBoZXI7IGFmdGVyIHNldmVyYWwgdHJpYWxzLCB0aGUgZXhwZXJpbWVudGVyIGdhdmUgdGhlIGNoaWxkIHRoZSBvcHRpb24gdG8gY29udGludWUgaW5kZXBlbmRlbnRseSAocmVhZGluZyB0aGUgcXVlc3Rpb25zIGFuZCBzZWxlY3RpbmcgdGhlaXIgYW5zd2VycyB0aGVtc2VsdmVzKSBpZiB0aGV5IGRlc2lyZWQuIFJvdWdobHkgaGFsZiBvZiBwYXJ0aWNpcGFudHMgY29tcGxldGVkIHRoZSByZW1haW5kZXIgb2YgdGhlIHRhc2sgaW5kZXBlbmRlbnRseS4KCiMjIyBEYXRhIHByb2Nlc3NpbmcKCldlIGRyb3BwZWQgdHJpYWxzIHdpdGggcmVzcG9uc2UgdGltZXMgdGhhdCB3ZXJlIGZhc3RlciB0aGFuIGEgcHJlc2V0IGNyaXRlcmlvbiBvZiAyNTBtcyAoX25fPTMgY2hpbGQgdHJpYWxzLCBfbl89OTcgYWR1bHQgdHJpYWxzKSBhbmQgcmV0YWluZWQgcGFydGljaXBhbnRzIHJlZ2FyZGxlc3Mgb2Ygc2tpcHBlZCB0cmlhbHMgKF9uXz01NSBjaGlsZCB0cmlhbHMsIF9uXz0xIGFkdWx0IHRyaWFsKS4gT3ZlcmFsbCwgb25seSAxJSBvZiBhZHVsdCB0cmlhbHMgYW5kIDElIG9mIGNoaWxkIHRyaWFscyB3ZXJlIG1pc3NpbmcgZGF0YTsgaW4gdGhlc2UgY2FzZXMsIHdlIGltcHV0ZWQgbWlzc2luZyB2YWx1ZXMgdXNpbmcgdGhlIG1lZGlhbiBieSB0YXJnZXQgY2hhcmFjdGVyLCBjYXBhY2l0eSwgYW5kIGFnZSBncm91cC4KCiMjIFJlc3VsdHMKCiMjIyBDb25jZXB0dWFsIHN0cnVjdHVyZTogQWR1bHRzCgpgYGB7cn0KIyBpbXBsZW1lbnQgMyBmYWN0b3IgcmV0ZW50aW9uIHByb3RvY29scwpuZmFjdF9wYXJfZDFfYWQgPC0gZmEucGFyYWxsZWwoZDFfYWRfd2lkZV9pLCBjb3IgPSBjaG9zZW5fY29yLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtID0gY2hvc2VuX2ZtLCBwbG90ID0gRikkbmZhY3QKbmZhY3RfYmljX2QxX2FkIDwtIHZzcyhkMV9hZF93aWRlX2ksIGNvciA9IGNob3Nlbl9jb3IsIHJvdGF0ZSA9IGNob3Nlbl9yb3QsIAogICAgICAgICAgICAgICAgICAgICAgIGZtID0gY2hvc2VuX2ZtLCBwbG90ID0gRikkdnNzLnN0YXRzJEJJQyAlPiUgd2hpY2gubWluKCkKbmZhY3Rfd2RtX2QxX2FkIDwtIHJldGVuX2Z1bihkMV9hZF93aWRlX2ksIHJvdF90eXBlID0gY2hvc2VuX3JvdCkKCmNhdCgiUGFyYWxsZWwgYW5hbHlzaXM6ICIsIG5mYWN0X3Bhcl9kMV9hZCwKICAgICJcbk1pbmltaXppbmcgQklDOiAiLCBuZmFjdF9iaWNfZDFfYWQsCiAgICAiXG5XZWlzbWFuIGV0IGFsLjogIiwgbmZhY3Rfd2RtX2QxX2FkKQpgYGAKCmBgYHtyfQplZmFfNF9kMV9hZCA8LSBmYV9mdW4oZDFfYWRfd2lkZV9pLCA0KQoKYGBgCgpUd28gb2Ygb3VyIHRocmVlIG1ldGhvZHMgZm9yIGRldGVybWluaW5nIGhvdyBtYW55IGZhY3RvcnMgdG8gcmV0YWluIChtaW5pbWl6aW5nIEJJQyBhbmQgV2Vpc21hbiBldCBhbC4ncyBmYWN0b3IgcmV0ZW50aW9uIGNyaXRlcmlhKSBzdWdnZXN0ZWQgcmV0YWluaW5nIHRocmVlIGZhY3RvcnMuIChQYXJhbGxlbCBhbmFseXNpcyBzdWdnZXN0ZWQgcmV0YWluaW5nIGZvdXIgZmFjdG9ycy4gVGhyZWUgb2YgdGhlc2UgZmFjdG9ycyB3ZXJlIHZlcnkgc2ltaWxhciB0byB0aGUgdGhyZWUgZmFjdG9ycyByZXBvcnRlZCBiZWxvdywgYW5kIHRoZSBmb3VydGggZmFjdG9yIHdhcyBkb21pbmFudCBmb3IgYSBoYW5kZnVsIG9mIHNlbnNvcnkgYW5kIHBlcmNlcHR1YWwgY2FwYWNpdGllcywgaW5jbHVkaW5nIGByIHRvcF9uX2RvbUNhcChlZmFfNF9kMV9hZCwgNCwgIkY0IiwgInBvcyIpYDsgc2VlIFNPTS4pCgpgYGB7cn0KZWZhXzNfZDFfYWQgPC0gZmFfZnVuKGQxX2FkX3dpZGVfaSwgMykKZWZhXzNfcGxvdF9kMV9hZCA8LSBoZWF0bWFwX2Z1bihlZmFfM19kMV9hZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gYygiSEVBUlQiLCAiQk9EWSIsICJNSU5EIikpICsKICBsYWJzKHRpdGxlID0gcGFzdGUwKCJBZHVsdHMgKG49IiwgbnJvdyhkMV9hZF93aWRlX2kpLCAiKSIpKQpgYGAKCkFmdGVyIHJvdGF0aW9uLCB0aGUgZmlyc3QgZmFjdG9yIGNvcnJlc3BvbmRlZCBwcmltYXJpbHkgdG8gY2FwYWNpdGllcyBmb3Igc2VsZi0gYW5kIG90aGVyLXJlbGV2YW50IGVtb3Rpb25z4oCUYSBzdWl0ZSBvZiBjYXBhY2l0aWVzIHRoYXQgd2UgKGZvbGxvd2luZyBXZWlzbWFuIGV0IGFsLikgd2lsbCByZWZlciB0byBhcyBfSEVBUlRfLiBJdCB3YXMgdGhlIGRvbWluYW50IGZhY3RvciBmb3Igc3VjaCBpdGVtcyBhcyBgciB0b3Bfbl9kb21DYXAoZWZhXzNfZDFfYWQsIDQsICJGMSIsICJwb3MiKWAsIGFuZCBhY2NvdW50ZWQgZm9yIGByIHJvdW5kKGVmYV8zX2QxX2FkJFZhY2NvdW50ZWRbIlByb3BvcnRpb24gRXhwbGFpbmVkIiwgIkYxIl0sIDIpICogMTAwYCUgb2YgdGhlIHNoYXJlZCB2YXJpYW5jZSBpbiB0aGUgcm90YXRlZCB0aHJlZS1mYWN0b3Igc29sdXRpb24uCgpUaGUgc2Vjb25kIGZhY3RvciBjb3JyZXNwb25kZWQgcHJpbWFyaWx5IHRvIHBoeXNpb2xvZ2ljYWwgc2Vuc2F0aW9ucyByZWxhdGVkIHRvIGJpb2xvZ2ljYWwgbmVlZHPigJRhIHN1aXRlIG9mIGNhcGFjaXRpZXMgdGhhdCB3ZSAoZm9sbG93aW5nIFdlaXNtYW4gZXQgYWwuKSB3aWxsIHJlZmVyIHRvIGFzIF9CT0RZXy4gSXQgd2FzIHRoZSBkb21pbmFudCBmYWN0b3IgZm9yIHN1Y2ggaXRlbXMgYXMgYHIgdG9wX25fZG9tQ2FwKGVmYV8zX2QxX2FkLCA0LCAiRjIiLCAicG9zIilgLCBhbmQgYWNjb3VudGVkIGZvciBgciByb3VuZChlZmFfM19kMV9hZCRWYWNjb3VudGVkWyJQcm9wb3J0aW9uIEV4cGxhaW5lZCIsICJGMiJdLCAyKSAqIDEwMGAlIG9mIHRoZSBzaGFyZWQgdmFyaWFuY2UgaW4gdGhlIHJvdGF0ZWQgdGhyZWUtZmFjdG9yIHNvbHV0aW9uLiAKClRoZSB0aGlyZCBmYWN0b3IgY29ycmVzcG9uZGVkIHByaW1hcmlseSB0byBwZXJjZXB0dWFsLWNvZ25pdGl2ZSBhYmlsaXRpZXMgdG8gZGV0ZWN0IGFuZCB1c2UgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVudmlyb25tZW504oCUYSBzdWl0ZSBvZiBjYXBhY2l0aWVzIHRoYXQgd2UgKGZvbGxvd2luZyBXZWlzbWFuIGV0IGFsLikgd2lsbCByZWZlciB0byBhcyBfTUlORF8uIEl0IHdhcyB0aGUgZG9taW5hbnQgZmFjdG9yIGZvciBzdWNoIGl0ZW1zIGFzIGByIHRvcF9uX2RvbUNhcChlZmFfM19kMV9hZCwgNCwgIkYzIiwgInBvcyIpYCwgYW5kIGFjY291bnRlZCBmb3IgYHIgcm91bmQoZWZhXzNfZDFfYWQkVmFjY291bnRlZFsiUHJvcG9ydGlvbiBFeHBsYWluZWQiLCAiRjMiXSwgMikgKiAxMDBgJSBvZiB0aGUgc2hhcmVkIHZhcmlhbmNlIGluIHRoZSByb3RhdGVkIHRocmVlLWZhY3RvciBzb2x1dGlvbi4gIAoKU2VlIEZpZ3VyZSAxIGZvciBhbGwgZmFjdG9yIGxvYWRpbmdzLiAoTm90ZSB0aGF0IGZvciB0aGUgc2FrZSBvZiBjb25zaXN0ZW5jeSBhY3Jvc3Mgc3R1ZGllcyBhbmQgY29tcGFyaXNvbiB3aXRoIFdlaXNtYW4gZXQgYWwuJ3Mgd29yaywgd2UgaGF2ZSBwbG90dGVkIHRoZXNlIGZhY3RvcnMgaW4gdGhlIHNhbWUgb3JkZXIgZm9yIGFsbCBzdHVkaWVzOiBfQk9EWV8sIF9IRUFSVF8sIGFuZCBfTUlORF8uKQoKSW4gc3VtLCBhcyBXZWlzbWFuIGV0IGFsLidzIG9yaWdpbmFsIHN0dWRpZXMsIGEgdGhyZWUtZmFjdG9yIHN0cnVjdHVyZSBlbWVyZ2VkIGZyb20gYWR1bHRzJyBtZW50YWwgY2FwYWNpdHkgYXR0cmlidXRpb25zLCBjaGFyYWN0ZXJpemVkIGJ5IGEgZGlzdGluY3Rpb24gYmV0d2VlbiBib2R5LCBoZWFydCwgYW5kIG1pbmQuIFRoaXMgc3VnZ2VzdHMgdGhhdCBvdXIgY2hpbGQtZnJpZW5kbHkgcGFyYWRpZ20gd2FzIHZhbGlkOiBVc2luZyByZXdvcmRlZCBpdGVtcyBhbmQgYSB0aHJlZS1wb2ludCByZXNwb25zZSBzY2FsZSBlbGljaXRlZCB0aGUgc2FtZSBpbnR1aXRpdmUgb250b2xvZ3kgb2YgbWVudGFsIGxpZmUsIGFtb25nIGFkdWx0cywgdGhhdCBoYXMgYmVlbiByZXZlYWxlZCBieSBtb3JlIGNvbXBsZXgsICJhZHVsdC1mcmllbmRseSIgZXhwZXJpbWVudGFsIHBhcmFkaWdtcy4gCgojIyMgQ29uY2VwdHVhbCBzdHJ1Y3R1cmU6IENoaWxkcmVuICg3LTl5KQoKYGBge3J9CiMgaW1wbGVtZW50IDMgZmFjdG9yIHJldGVudGlvbiBwcm90b2NvbHMKbmZhY3RfcGFyX2QxXzc5IDwtIGZhLnBhcmFsbGVsKGQxXzc5X3dpZGVfaSwgY29yID0gY2hvc2VuX2NvciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbSA9IGNob3Nlbl9mbSwgcGxvdCA9IEYpJG5mYWN0Cm5mYWN0X2JpY19kMV83OSA8LSB2c3MoZDFfNzlfd2lkZV9pLCBjb3IgPSBjaG9zZW5fY29yLCByb3RhdGUgPSBjaG9zZW5fcm90LCAKICAgICAgICAgICAgICAgICAgICAgICBmbSA9IGNob3Nlbl9mbSwgcGxvdCA9IEYpJHZzcy5zdGF0cyRCSUMgJT4lIHdoaWNoLm1pbigpCm5mYWN0X3dkbV9kMV83OSA8LSByZXRlbl9mdW4oZDFfNzlfd2lkZV9pLCByb3RfdHlwZSA9IGNob3Nlbl9yb3QpCgpjYXQoIlBhcmFsbGVsIGFuYWx5c2lzOiAiLCBuZmFjdF9wYXJfZDFfNzksCiAgICAiXG5NaW5pbWl6aW5nIEJJQzogIiwgbmZhY3RfYmljX2QxXzc5LAogICAgIlxuV2Vpc21hbiBldCBhbC46ICIsIG5mYWN0X3dkbV9kMV83OSkKYGBgCgpPdXIgdGhyZWUgbWV0aG9kcyBmb3IgZGV0ZXJtaW5pbmcgaG93IG1hbnkgZmFjdG9ycyB0byByZXRhaW4gYWxsIHN1Z2dlc3RlZCByZXRhaW5pbmcgdGhyZWUgZmFjdG9ycy4KCmBgYHtyfQplZmFfM19kMV83OSA8LSBmYV9mdW4oZDFfNzlfd2lkZV9pLCAzKQoKZWZhXzNfcGxvdF9kMV83OSA8LSBoZWF0bWFwX2Z1bihlZmFfM19kMV83OSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gYygiSEVBUlQiLCAiQk9EWSIsICJNSU5EIikpICsKICBsYWJzKHRpdGxlID0gcGFzdGUwKCJDaGlsZHJlbiA3LTl5IChuPSIsIG5yb3coZDFfNzlfd2lkZV9pKSwgIikiKSkgKwogIGd1aWRlcyhmaWxsID0gIm5vbmUiKQpgYGAKCmBgYHtyfQpjb25nX2VmYV8zX2QxX2FkXzc5IDwtIGZhLmNvbmdydWVuY2UoZWZhXzNfZDFfNzkkbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfM19kMV9hZCRsb2FkaW5ncykKYGBgCgpBZnRlciByb3RhdGlvbiwgdGhlIGZpcnN0IGZhY3RvciBjb3JyZXNwb25kZWQgcHJpbWFyaWx5IHRvIHNvY2lhbC1lbW90aW9uYWwgYWJpbGl0aWVzLiBBbiBhbmFseXNpcyBvZiBmYWN0b3IgY29uZ3J1ZW5jZSBjb25maXJtZWQgdGhhdCB0aGlzIGZhY3RvciB3YXMgbW9zdCBzaW1pbGFyIHRvIGFkdWx0cycgX0hFQVJUXyBmYWN0b3IgKGNvc2luZSBzaW1pbGFyaXR5IHdpdGggX0hFQVJUXzogYHIgY29uZ19lZmFfM19kMV9hZF83OVsiRjEiLCAiRjEiXWA7IHdpdGggX0JPRFlfOiBgciBjb25nX2VmYV8zX2QxX2FkXzc5WyJGMSIsICJGMiJdYDsgd2l0aCBfTUlORF86IGByIGNvbmdfZWZhXzNfZDFfYWRfNzlbIkYxIiwgIkYzIl1gKS4gSXQgd2FzIHRoZSBkb21pbmFudCBmYWN0b3IgZm9yIHN1Y2ggaXRlbXMgYXMgYHIgdG9wX25fZG9tQ2FwKGVmYV8zX2QxXzc5LCA0LCAiRjEiLCAicG9zIilgLCBhbmQgYWNjb3VudGVkIGZvciBgciByb3VuZChlZmFfM19kMV83OSRWYWNjb3VudGVkWyJQcm9wb3J0aW9uIEV4cGxhaW5lZCIsICJGMSJdLCAyKSAqIDEwMGAlIG9mIHRoZSBzaGFyZWQgdmFyaWFuY2UgaW4gdGhlIHJvdGF0ZWQgdGhyZWUtZmFjdG9yIHNvbHV0aW9uLiAKClRoZSBzZWNvbmQgZmFjdG9yIGNvcnJlc3BvbmRlZCBwcmltYXJpbHkgdG8gcGh5c2lvbG9naWNhbCBzZW5zYXRpb25zLiBBbiBhbmFseXNpcyBvZiBmYWN0b3IgY29uZ3J1ZW5jZSBjb25maXJtZWQgdGhhdCB0aGlzIGZhY3RvciB3YXMgbW9zdCBzaW1pbGFyIHRvIGFkdWx0cycgX0JPRFlfIGZhY3RvciAoY29zaW5lIHNpbWlsYXJpdHkgd2l0aCBfQk9EWV86IGByIGNvbmdfZWZhXzNfZDFfYWRfNzlbIkYyIiwgIkYyIl1gOyB3aXRoIF9IRUFSVF86IGByIGNvbmdfZWZhXzNfZDFfYWRfNzlbIkYyIiwgIkYxIl1gOyB3aXRoIF9NSU5EXzogYHIgY29uZ19lZmFfM19kMV9hZF83OVsiRjIiLCAiRjMiXWApLiBJdCB3YXMgdGhlIGRvbWluYW50IGZhY3RvciBmb3Igc3VjaCBpdGVtcyBhcyBgciB0b3Bfbl9kb21DYXAoZWZhXzNfZDFfNzksIDQsICJGMiIsICJwb3MiKWAsIGFuZCBhY2NvdW50ZWQgZm9yIGByIHJvdW5kKGVmYV8zX2QxXzc5JFZhY2NvdW50ZWRbIlByb3BvcnRpb24gRXhwbGFpbmVkIiwgIkYyIl0sIDIpICogMTAwYCUgb2YgdGhlIHNoYXJlZCB2YXJpYW5jZSBpbiB0aGUgcm90YXRlZCB0aHJlZS1mYWN0b3Igc29sdXRpb24uIAoKVGhlIHRoaXJkIGZhY3RvciBjb3JyZXNwb25kZWQgcHJpbWFyaWx5IHRvIHBlcmNlcHR1YWwtY29nbml0aXZlIGFiaWxpdGllcy4gQW4gYW5hbHlzaXMgb2YgZmFjdG9yIGNvbmdydWVuY2UgY29uZmlybWVkIHRoYXQgdGhpcyBmYWN0b3Igd2FzIG1vc3Qgc2ltaWxhciB0byBhZHVsdHMnIF9NSU5EXyBmYWN0b3IgKGNvc2luZSBzaW1pbGFyaXR5IHdpdGggX01JTkRfOiBgciBjb25nX2VmYV8zX2QxX2FkXzc5WyJGMyIsICJGMyJdYDsgd2l0aCBfSEVBUlRfOiBgciBjb25nX2VmYV8zX2QxX2FkXzc5WyJGMyIsICJGMSJdYDsgd2l0aCBfQk9EWV86IGByIGNvbmdfZWZhXzNfZDFfYWRfNzlbIkYzIiwgIkYyIl1gKS4gSXQgd2FzIHRoZSBkb21pbmFudCBmYWN0b3IgZm9yIHN1Y2ggaXRlbXMgYXMgYHIgdG9wX25fZG9tQ2FwKGVmYV8zX2QxXzc5LCA0LCAiRjMiLCAicG9zIilgLCBhbmQgYWNjb3VudGVkIGZvciBgciByb3VuZChlZmFfM19kMV83OSRWYWNjb3VudGVkWyJQcm9wb3J0aW9uIEV4cGxhaW5lZCIsICJGMyJdLCAyKSAqIDEwMGAlIG9mIHRoZSBzaGFyZWQgdmFyaWFuY2UgaW4gdGhlIHJvdGF0ZWQgdGhyZWUtZmFjdG9yIHNvbHV0aW9uLiAoU2VlIEZpZ3VyZSAxIGZvciBhbGwgZmFjdG9yIGxvYWRpbmdzLikKCkluIHN1bSwgbGlrZSBhZHVsdHMsIGNoaWxkcmVuJ3MgbWVudGFsIGNhcGFjaXR5IGF0dHJpYnV0aW9ucyB3ZXJlIGRvbWluYXRlZCBieSBhIHRocmVlLXdheSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHBoeXNpb2xvZ2ljYWwsIHNvY2lhbC1lbW90aW9uYWwsIGFuZCBwZXJjZXB0dWFsLWNvZ25pdGl2ZSBhYmlsaXRpZXPigJRpLmUuLCBib2R5LCBoZWFydCwgYW5kIG1pbmQuCgpgYGB7ciwgaW5jbHVkZSA9IFQsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAwLjY3fQpmaWcwMV9wbG90cyA8LSBwbG90X2dyaWQoZWZhXzNfcGxvdF9kMV83OSwgZWZhXzNfcGxvdF9kMV9hZCwKICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF93aWR0aHMgPSBjKDAuODUsIDEpLCBsYWJlbHMgPSBjKCJBIiwgIkIiKSkKZmlnMDFfd2l0aF9jYXB0aW9uIDwtIGFkZF9zdWIoZmlnMDFfcGxvdHMsIHN0cl93cmFwKCJGaWd1cmUgMTogRXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzIHJlc3VsdHMgZm9yIDctIHRvIDkteWVhci1vbGQgY2hpbGRyZW4gKEEpIGFuZCBhZHVsdHMgKEIpIGluIFN0dWR5IDEsIGluIHdoaWNoIGVhY2ggcGFydGljaXBhbnQgYXNzZXNzZWQgNDAgbWVudGFsIGNhcGFjaXRpZXMgZm9yIG9uZSBvZiB0d28gdGFyZ2V0IGNoYXJhY3RlcnM6IGEgYmVldGxlIG9yIGEgcm9ib3QuIiwgMTQzKSwgeCA9IDAsIGhqdXN0ID0gMCkKZ2dkcmF3KGZpZzAxX3dpdGhfY2FwdGlvbikKYGBgCgojIyMgQXR0cmlidXRpb25zIG9mIG1lbnRhbCBsaWZlCgpUaGUgZmFjdG9yIGFuYWx5c2VzIG9mIGNvcnJlbGF0aW9ucyBhbW9uZyBtZW50YWwgY2FwYWNpdHkgYXR0cmlidXRpb25zIGp1c3QgZGVzY3JpYmVkIHNoZWQgbGlnaHQgb24gb25lIGFzcGVjdCBvZiBjaGlsZHJlbidzIGNvbmNlcHRzIG9mIG1lbnRhbCBsaWZlOiBpdHMgb250b2xvZ2ljYWwgc3RydWN0dXJlLiBUaGUgZGVzaWduIG9mIG91ciBzdHVkeSBhbHNvIGFsbG93cyB1cyB0byBsb29rIGF0IGEgc2Vjb25kIGFzcGVjdCBvZiBjb25jZXB0dWFsIGRldmVsb3BtZW50IGluIHRoaXMgZG9tYWluOiBjaGlsZHJlbidzIGFwcGxpY2F0aW9uIG9mIHRoaXMgY29uY2VwdCwgaS5lLiwgd2hpY2ggbWVudGFsIGNhcGFjaXRpZXMgdGhleSB0ZW5kIHRvIGF0dHJpYnV0ZSBvciBub3QgdG8gYXR0cmlidXRlIHRvIHRoZSBkaWZmZXJlbnQgdGFyZ2V0IGNoYXJhY3RlcnMuIEhvdyBtaWdodCBjaGlsZHJlbidzIGF0dHJpYnV0aW9ucyBvZiBjYXBhY2l0aWVzIHJlbGF0ZWQgdG8gX0JPRFlfLCBfSEVBUlRfLCBhbmQgX01JTkRfIHZhcnkgYWNyb3NzIG1pZGRsZSBjaGlsZGhvb2QgKDctOXkpLCBhbmQgaG93IGRvIHRoZXkgY29tcGFyZSB0byB0aGUgbWVudGFsIGNhcGFjaXR5IGF0dHJpYnV0aW9ucyBvZiBhZHVsdHM/CgojIyMjIENoaWxkcmVuIHZzLiBhZHVsdHMKCmBgYHtyfQpkMV9hbGxfd2lkZV9pIDwtIGQxX2FkX3dpZGVfaSAlPiUKICByb3duYW1lc190b19jb2x1bW4oInN1YmlkX2NoYXIiKSAlPiUKICBmdWxsX2pvaW4oZDFfNzlfd2lkZV9pICU+JQogICAgICAgICAgICAgIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWRfY2hhciIpKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInN1YmlkX2NoYXIiKQpgYGAKCmBgYHtyfQplZmFfM19kMV83OV9wcm9qZWN0X3Njb3JlcyA8LSBwcmVkaWN0KG9iamVjdCA9IGVmYV8zX2QxX2FkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkMV83OV93aWRlX2ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkLmRhdGEgPSBkMV9hZF93aWRlX2kpICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oInN1YmlkX2NoYXIiKSAlPiUKICBtdXRhdGUoc3ViaWQgPSBnc3ViKCJfLiokIiwgIiIsIHN1YmlkX2NoYXIpLAogICAgICAgICBjaGFyYWN0ZXIgPSBnc3ViKCJeLipfIiwgIiIsIHN1YmlkX2NoYXIpKSAlPiUKICBnYXRoZXIoZmFjdG9yLCBzY29yZSwgLWMoc3ViaWQsIGNoYXJhY3Rlciwgc3ViaWRfY2hhcikpICU+JQogIG11dGF0ZShmYWN0b3JfbmFtZSA9IHJlY29kZV9mYWN0b3IoZmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkYyIiA9ICJCT0RZIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGMSIgPSAiSEVBUlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkYzIiA9ICJNSU5EIikpICU+JQogIGFycmFuZ2Uoc3ViaWRfY2hhcikKYGBgCgpUbyBjb21wYXJlIGNoaWxkcmVuJ3MgbWVudGFsIGNhcGFjaXR5IGF0dHJpYnV0aW9ucyB0byB0aG9zZSBvZiBhZHVsdHMsIHdlIHByb2plY3RlZCBjaGlsZHJlbidzIHJlc3BvbnNlcyBpbnRvIHRoZSBmYWN0b3Igc3BhY2UgZGVmaW5lZCBieSBhZHVsdHMgKHN0YW5kYXJkaXplZCBpbiB0ZXJtcyBvZiBhZHVsdHMnIHJlc3BvbnNlcyksIGFuZCBleGFtaW5lZCBmYWN0b3Igc2NvcmVzIGJ5IGFnZSBncm91cCAodXNpbmcgdGhlIGNvcnJlbGF0aW9uLXByZXNlcnZpbmcgbWV0aG9kIGFydGljdWxhdGVkIGJ5IHRlbiBCZXJnZSwgS3Jpam5lbiwgV2Fuc2JlZWssICYgU2hhcGlybywgMTk5OSwgYXMgaW1wbGVtZW50ZWQgaW4gdGhlICJwc3ljaCIgcGFja2FnZSBmb3IgUiwgUmV2ZWxsZSwgMjAxOCkuIFRoaXMgeWllbGRlZCB0aHJlZSBzY29yZXMgZm9yIGVhY2ggcGFydGljaXBhbnQsIGNvcnJlc3BvbmRpbmcsIGluIHByaW5jaXBsZSwgdG8gaG9saXN0aWMganVkZ21lbnRzIG9mIHRoZSBzb2NpYWwtZW1vdGlvbmFsLCBwaHlzaW9sb2dpY2FsLCBhbmQgcGVyY2VwdHVhbC1jb2duaXRpdmUgYWJpbGl0aWVzIG9mIHRoZSB0YXJnZXQgY2hhcmFjdGVyIHRoZSBwYXJ0aWNpcGFudCBldmFsdWF0ZWQuIChOb3RlIHRoYXQgZWFjaCBvZiB0aGVzZSB0aHJlZSBzY29yZXMgdGFrZXMgaW50byBhY2NvdW50IGZhY3RvciBsb2FkaW5ncyBmb3IgYWxsIDQwIG1lbnRhbCBjYXBhY2l0aWVzLCBhcyBzaG93biBpbiBGaWd1cmUgMS4pIAoKVGhpcyBhbGxvd2VkIHVzIHRvIGV4YW1pbmUgdGhlIGVmZmVjdHMgb2YgYWdlIGdyb3VwIChhZHVsdCwgY2hpbGQpLCBjaGFyYWN0ZXIgKGJlZXRsZSwgcm9ib3QpLCBhbmQgZmFjdG9yIChfQk9EWV8sIF9IRUFSVF8sIF9NSU5EXykgb24gdGhlc2Ugc2NvcmVzIHZpYSBtaXhlZCBlZmZlY3RzIEJheWVzaWFuIHJlZ3Jlc3Npb24uIFNlZSBUYWJsZSAxIGZvciB0aGUgcmVzdWx0cyBvZiBhIG1heGltYWwgbW9kZWwgYW5kIEZpZ3VyZSA0IGZvciBzY29yZXMgYnkgYWdlIGdyb3VwLCBhZ2UgKGZvciBjaGlsZHJlbiksIGZhY3RvciwgYW5kIGNoYXJhY3Rlci4gCgpgYGB7cn0KZWZhXzNfc2NvcmVzX2QxX2FsbCA8LSBlZmFfM19kMV9hZCRzY29yZXMgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWRfY2hhciIpICU+JQogIGdhdGhlcihmYWN0b3IsIHNjb3JlLCAtc3ViaWRfY2hhcikgJT4lCiAgbXV0YXRlKHN1YmlkID0gZ3N1YigiX2JlZXRsZSIsICIiLCBzdWJpZF9jaGFyKSwKICAgICAgICAgc3ViaWQgPSBnc3ViKCJfcm9ib3QiLCAiIiwgc3ViaWQpLAogICAgICAgICBjaGFyYWN0ZXIgPSBnc3ViKCJeLipfIiwgIiIsIHN1YmlkX2NoYXIpLAogICAgICAgICBhZ2VfZ3JvdXAgPSAiYWR1bHRzIiwKICAgICAgICAgZmFjdG9yX25hbWUgPSByZWNvZGVfZmFjdG9yKGZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGMiIgPSAiQk9EWSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRjEiID0gIkhFQVJUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGMyIgPSAiTUlORCIpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBmdWxsX2pvaW4oZWZhXzNfZDFfNzlfcHJvamVjdF9zY29yZXMgJT4lIAogICAgICAgICAgICAgIGxlZnRfam9pbihkMV83OSAlPiUgZGlzdGluY3Qoc3ViaWQsIGFnZV9ncm91cCwgYWdlKSkpICU+JQogIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJmYWN0b3IiKSwgY2hhcmFjdGVyLCBhZ2VfZ3JvdXApLCBmdW5zKGZhY3RvcikpCgplZmFfM19zY29yZXNfYm9vdF9kMV9hbGwgPC0gZWZhXzNfc2NvcmVzX2QxX2FsbCAlPiUKICBncm91cF9ieShhZ2VfZ3JvdXAsIGZhY3RvciwgZmFjdG9yX25hbWUsIGNoYXJhY3RlcikgJT4lCiAgbXVsdGlfYm9vdF9zdGFuZGFyZChjb2wgPSAic2NvcmUiKSAlPiUKICB1bmdyb3VwKCkKYGBgCgpgYGB7cn0KY29udHJhc3RzKGVmYV8zX3Njb3Jlc19kMV9hbGwkY2hhcmFjdGVyKSA8LSBjYmluZCgiUl9HTSIgPSBjKC0xLCAxKSkKY29udHJhc3RzKGVmYV8zX3Njb3Jlc19kMV9hbGwkYWdlX2dyb3VwKSA8LSBjYmluZCgiQ0g3OV9BRCIgPSBjKDAsIDEpKQpjb250cmFzdHMoZWZhXzNfc2NvcmVzX2QxX2FsbCRmYWN0b3JfbmFtZSkgPC0gY2JpbmQoIkhfR00iID0gYygtMSwgMSwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTV9HTSIgPSBjKC0xLCAwLCAxKSkKCiMgZWZhXzNfc2NvcmVzX3JfZDFfYWxsIDwtIGJybShzY29yZSB+IGZhY3Rvcl9uYW1lICogYWdlX2dyb3VwICogY2hhcmFjdGVyCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgxfHN1YmlkKSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBlZmFfM19zY29yZXNfZDFfYWxsLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlZCA9IDEyMzQ1LAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZXMgPSA0LAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGxpc3QoYWRhcHRfZGVsdGEgPSAwLjk5KSkKIyBzYXZlUkRTKGVmYV8zX3Njb3Jlc19yX2QxX2FsbCwgZmlsZSA9ICIuL2JybXNfbW9kZWxzL2VmYV8zX3Njb3Jlc19yX2QxX2FsbC5yZHMiKQoKZWZhXzNfc2NvcmVzX3JfZDFfYWxsIDwtIHJlYWRSRFMoIi4vYnJtc19tb2RlbHMvZWZhXzNfc2NvcmVzX3JfZDFfYWxsLnJkcyIpCiMgc3VtbWFyeShlZmFfM19zY29yZXNfcl9kMV9hbGwpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBULCByZXN1bHRzID0gImFzaXMifQpmaXhlZihlZmFfM19zY29yZXNfcl9kMV9hbGwpICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oIlBhcmFtZXRlciIpICU+JQogIG11dGF0ZShQYXJhbWV0ZXIgPSByZWNvZGVfZmFjdG9yKFBhcmFtZXRlciwKICAgICJJbnRlcmNlcHQiID0gIihJbnRlcmNlcHQpIiwKICAgICJjaGFyYWN0ZXJSX0dNIiA9ICJjaGFyYWN0ZXIgKHJvYm90IHZzLiBncmFuZCBtZWFuKSIsCiAgICAiZmFjdG9yX25hbWVIX0dNIiA9ICJIRUFSVCAodnMuIGdyYW5kIG1lYW4pIiwKICAgICJmYWN0b3JfbmFtZU1fR00iID0gIk1JTkQgKHZzLiBncmFuZCBtZWFuKSIsCiAgICAiZmFjdG9yX25hbWVIX0dNOmNoYXJhY3RlclJfR00iID0gImNoYXJhY3RlciDDlyBIRUFSVCIsCiAgICAiZmFjdG9yX25hbWVNX0dNOmNoYXJhY3RlclJfR00iID0gImNoYXJhY3RlciDDlyBNSU5EIiwKICAgICJhZ2VfZ3JvdXBDSDc5X0FEIiA9ICJhZ2UgZ3JvdXAgKGNoaWxkcmVuIHZzLiBhZHVsdHMpIiwKICAgICJhZ2VfZ3JvdXBDSDc5X0FEOmNoYXJhY3RlclJfR00iID0gImNoYXJhY3RlciDDlyBhZ2UgZ3JvdXAiLAogICAgImZhY3Rvcl9uYW1lSF9HTTphZ2VfZ3JvdXBDSDc5X0FEIiA9ICJIRUFSVCDDlyBhZ2UgZ3JvdXAiLAogICAgImZhY3Rvcl9uYW1lTV9HTTphZ2VfZ3JvdXBDSDc5X0FEIiA9ICJNSU5EIMOXIGFnZSBncm91cCIsCiAgICAiZmFjdG9yX25hbWVIX0dNOmFnZV9ncm91cENINzlfQUQ6Y2hhcmFjdGVyUl9HTSIgPSAiY2hhcmFjdGVyIMOXIEhFQVJUIMOXIGFnZSBncm91cCIsCiAgICAiZmFjdG9yX25hbWVNX0dNOmFnZV9ncm91cENINzlfQUQ6Y2hhcmFjdGVyUl9HTSIgPSAiY2hhcmFjdGVyIMOXIE1JTkQgw5cgYWdlIGdyb3VwIikpICU+JQogIGFycmFuZ2UoUGFyYW1ldGVyKSAlPiUKICBtdXRhdGUoWCA9IGlmZWxzZShRMi41ICogUTk3LjUgPiAwLCAiKiIsICIiKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoLVBhcmFtZXRlciwgLVgpLAogICAgICAgICAgICBmdW5zKGZvcm1hdChyb3VuZCguLCAyKSwgbnNtYWxsID0gMikpKSAlPiUKICByZW5hbWUoYiA9IEVzdGltYXRlLCBFcnJvciA9IEVzdC5FcnJvciwgIiAiID0gWCkgJT4lCiAgdW5pdGUoYDk1JSBDSWAsIFEyLjUsIFE5Ny41LCBzZXAgPSAiLCAiKSAlPiUKICBtdXRhdGUoYDk1JSBDSWAgPSBwYXN0ZTAoIlsiLCBgOTUlIENJYCwgIl0iKSkgJT4lCiAga25pdHI6OmthYmxlKGZvcm1hdCA9ICJodG1sIiwgYWxpZ24gPSBjKCJsIiwgcmVwKCJyIiwgMykpLAogICAgICAgICAgICAgICBjYXB0aW9uID0gIlRhYmxlIDE6IEZpeGVkIGVmZmVjdHMgZnJvbSBhIG1peGVkLWVmZmVjdHMgQmF5ZXNpYW4gcmVncmVzc2lvbiBtb2RlbCBwcmVkaWN0aW5nIGZhY3RvciBzY29yZXMgaW4gU3R1ZHkgMSBieSBjaGFyYWN0ZXIgKGJlZXRsZSwgcm9ib3QpLCBmYWN0b3IgKEJPRFksIEhFQVJULCBNSU5EKSwgYW5kIGFnZSBncm91cCAoYWR1bHRzLCBjaGlsZHJlbikuIFRoZSBtb2RlbCB1c2VkIHRoZSBmb3JtdWxhICdmYWN0b3Igc2NvcmUgfiBmYWN0b3IgKiBhZ2UgZ3JvdXAgKiBjaGFyYWN0ZXIgKyAoMSB8IHN1YmplY3QpJyBhbmQgd2FzIGltcGxlbWVudGVkIGluIHRoZSAnYnJtcycgcGFja2FnZSBmb3IgUiAoQsO8cmtuZXIsIDIwMTcpLiBGYWN0b3IgYW5kIGNoYXJhY3RlciB3ZXJlIGVmZmVjdC1jb2RlZDsgYWdlIGdyb3VwIHdhcyBkdW1teS1jb2RlZCB3aXRoIGFkdWx0cyBhcyB0aGUgYmFzZWxpbmUuIEFzdGVyaXNrcyBtYXJrIHBhcmFtZXRlcnMgd2hvc2UgOTUlIGNyZWRpYmxlIGludGVydmFsIGRvZXMgbm90IGluY2x1ZGUgMC4iKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkgJT4lCiAgZ3JvdXBfcm93cygiQWR1bHRzIiwgMSwgNikgJT4lCiAgZ3JvdXBfcm93cygiNy05eSB2cy4gYWR1bHRzIiwgNywgMTIpCmBgYAoKQ29sbGFwc2luZyBhY3Jvc3MgZmFjdG9ycywgZmFjdG9yIHNjb3JlcyBzdWdnZXN0IHRoYXQgYWR1bHRzIGdlbmVyYWxseSBhdHRyaWJ1dGVkIGZld2VyIG1lbnRhbCBjYXBhY2l0aWVzIHRvIHRoZSByb2JvdCB0aGFuIHRoZSBiZWV0bGUgKGByIHdyaXRlX2JfOTVDSV9mdW4oZWZhXzNfc2NvcmVzX3JfZDFfYWxsLCAiY2hhcmFjdGVyUl9HTSIpYCkuIEhvd2V2ZXIsIHRoaXMgYXBwZWFycyB0byBiZSBlbnRpcmVseSBkdWUgdG8gdGhlIGh1Z2UgZGlzY3JlcGFuY3kgYmV0d2VlbiBjaGFyYWN0ZXJzIGluIHRoZSBfQk9EWV8gZG9tYWluOyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGNoYXJhY3RlcnMgd2FzIHJlZHVjZWQgdG8gbm90aGluZyBpbiB0aGUgX0hFQVJUXyBkb21haW4gKGByIHdyaXRlX2JfOTVDSV9mdW4oZWZhXzNfc2NvcmVzX3JfZDFfYWxsLCAiZmFjdG9yX25hbWVIX0dNOmNoYXJhY3RlclJfR00iKWApLCBhbmQgcmV2ZXJzZWQgaW4gdGhlIHBlcmNlcHR1YWwtY29nbml0aXZlIGRvbWFpbiAoYHIgd3JpdGVfYl85NUNJX2Z1bihlZmFfM19zY29yZXNfcl9kMV9hbGwsICJmYWN0b3JfbmFtZU1fR006Y2hhcmFjdGVyUl9HTSIpYCkuIAoKTWVhbndoaWxlLCBjaGlsZHJlbiBjaGlsZHJlbiB0ZW5kZWQgdG8gYXR0cmlidXRlIG1vcmUgbWVudGFsIGNhcGFjaXRpZXMsIGNvbGxhcHNpbmcgYWNyb3NzIGNoYXJhY3RlcnMsIHRoYW4gZGlkIGFkdWx0cyAoYHIgd3JpdGVfYl85NUNJX2Z1bihlZmFfM19zY29yZXNfcl9kMV9hbGwsICJhZ2VfZ3JvdXBDSDc5X0FEIilgKSAtIGJ1dCB0aGlzIHdhcyBkcml2ZW4gcHJpbWFyaWx5IGJ5IHRoZSBzb2NpYWwtZW1vdGlvbmFsIGRvbWFpbiAoYHIgd3JpdGVfYl85NUNJX2Z1bihlZmFfM19zY29yZXNfcl9kMV9hbGwsICJmYWN0b3JfbmFtZUhfR006YWdlX2dyb3VwQ0g3OV9BRCIpYCksIGFuZCB3YXMgcmV2ZXJzZWQgaW4gdGhlIHBlcmNlcHR1YWwtY29nbml0aXZlIGRvbWFpbiAoYHIgd3JpdGVfYl85NUNJX2Z1bihlZmFfM19zY29yZXNfcl9kMV9hbGwsICJmYWN0b3JfbmFtZU1fR006YWdlX2dyb3VwQ0g3OV9BRCIpYCkuIAoKYGBge3IsIGZpZy53aWR0aCA9IDIsIGZpZy5hc3AgPSAzfQpmaWcwMl9wbG90IDwtIGdncGxvdChlZmFfM19zY29yZXNfYm9vdF9kMV9hbGwgJT4lCiAgICAgICAgIG11dGF0ZShhZ2VfZ3JvdXAgPSByZWNvZGVfZmFjdG9yKGFnZV9ncm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoaWxkcmVuNzkiID0gIjctOXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWR1bHRzIiA9ICJhZHVsdHMiKSksCiAgICAgICBhZXMoeCA9IGFnZV9ncm91cCwgeSA9IG1lYW4sIGNvbG9yID0gY2hhcmFjdGVyKSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZmFjdG9yX25hbWUpLCBzY2FsZXMgPSAiZnJlZSIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsdHkgPSAyKSArCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGNoYXJhY3RlciksIAogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSkgKwogIGdlb21fcG9pbnRyYW5nZShhZXMoeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLCAKICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0xMCwgMTAsIDEpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiNmYjlhOTkiLCAiIzFmNzhiNCIpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QoYWxwaGEgPSAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyA9IDIsIGJ5cm93ID0gVCwgcmV2ZXJzZSA9IEYpKSArCiAgbGFicyh4ID0gImFnZSBncm91cCIsIHkgPSAiIiwgY29sb3IgPSAiY2hhcmFjdGVyIikKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFQsIGZpZy53aWR0aCA9IDMsIGZpZy5hc3AgPSAzfQpmaWcwMl93aXRoX2NhcHRpb24gPC0gYWRkX3N1YihmaWcwMl9wbG90LCBzdHJfd3JhcCgiRmlndXJlIDI6IEZhY3RvciBzY29yZXMgZm9yIGFkdWx0cyBhbmQgNy0gdG8gOS15ZWFyLW9sZCBjaGlsZHJlbiBpbiBTdHVkeSAxLCBpbiB3aGljaCBlYWNoIHBhcnRpY2lwYW50IGFzc2Vzc2VkIDQwIG1lbnRhbCBjYXBhY2l0aWVzIGZvciBvbmUgb2YgdHdvIHRhcmdldCBjaGFyYWN0ZXJzOiBhIGJlZXRsZSAocGluayBjaXJjbGVzKSBvciBhIHJvYm90IChibHVlIHNxdWFyZXMpLiBFYWNoIHBhcnRpY2lwYW50IHJlY2lldmVkIGEgZmFjdG9yIHNjb3JlIGZvciBlYWNoIGZhY3RvciAoQk9EWSwgSEVBUlQsIGFuZCBNSU5ELCBhcyBkZWZpbmVkIGJ5IGFuIGV4cGxvcmF0b3J5IGZhY3RvciBhbmFseXNpcyBvZiBhZHVsdHMnIHJlc3BvbnNlcykuIFdlIHRyZWF0ZWQgdGhlc2Ugc2NvcmVzIGFzIHN1bW1hcmllcyBvZiB0aGF0IHBhcnRpY2lwYW50cycgbWVudGFsIGNhcGFjaXR5IGF0dHJpYnV0aW9ucyBpbiB0aGVzZSBkb21haW5zOyBhIHNjb3JlIG9mIDAgY29ycmVzcG9uZHMgdG8gdGhlIG1lYW4gZm9yIHRoYXQgZmFjdG9yIGFtb25nIGFkdWx0cy4gRXJyb3IgYmFycyBhcmUgYm9vdHN0cmFwcGVkIDk1JSBjb25maWRlbmNlIGludGVydmFscy4gTm90ZSB0aGF0IHRoZSByYW5nZSBvZiB0aGUgeS1heGlzIGRpZmZlcnMgYWNyb3NzIHBhbmVscy4iLCA2MiksIHggPSAwLCBoanVzdCA9IDApCmdnZHJhdyhmaWcwMl93aXRoX2NhcHRpb24pCmBgYAoKQSB2aXN1YWwgaW5zcGVjdGlvbiBvZiBGaWd1cmUgMiBjbGFyaWZpZXMgdGhlc2UgZmluZGluZ3MuIEF0dHJpYnV0aW9ucyBpbiB0aGUgX0JPRFlfIGFuZCBfTUlORF8gZG9tYWlucyB3ZXJlIHJhdGhlciBzaW1pbGFyIGZvciBjaGlsZHJlbiBhbmQgYWR1bHRzOiBCb3RoIGNoaWxkcmVuIGFuZCBhZHVsdHMgbWFya2VkIGEgY2xlYXIgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByb2JvdCBhbmQgdGhlIGJlZXRsZSBpbiB0aGUgcGh5c2lvbG9naWNhbCBzZW5zYXRpb25zIG9mIHRoZSBfQk9EWV8gKHRvcCByb3cpLCBpbiBsaW5lIHdpdGggdGhlIGFuaW1hdGXigJNpbmFuaW1hdGUgZGlzdGluY3Rpb247IGFuZCBib3RoIGFnZSBncm91cHMgY3JlZGl0ZWQgdGhlIHJvYm90IHdpdGggc2xpZ2h0bHkgZ3JlYXRlciBwZXJjZXB0dWFsLWNvZ25pdGl2ZSBza2lsbHMgKF9NSU5EXykgdGhhbiB0aGUgYmVldGxlIChib3R0b20gcm93KS4gSW4gY29udHJhc3QsIGluIHRoZSBfSEVBUlRfIGRvbWFpbiAobWlkZGxlIHJvdykgYm90aCB0aGUgYmVldGxlIGFuZCB0aGUgcm9ib3QgcmVjZWl2ZWQgcmF0aGVyIGxvdyBzY29yZXMgYW1vbmcgYWR1bHRzLCBidXQgdmVyeSBoaWdoIHNjb3JlcyBhbW9uZyBjaGlsZHJlbi4KClRoZSByYXcgZGF0YSBmdXJ0aGVyIHN1cHBvcnN0IHRoZXNlIG9ic2VydmF0aW9uczsgc2VlIEZpZ3VyZSAzIGZvciByYXcgY291bnRzIG9mIF9ub18sIF9raW5kYV8sIGFuZCBfeWVzXyByZXNwb25zZXMgZm9yIGFsbCBpdGVtcywgZ3JvdXBlZCBieSBmYWN0b3IsIGNoYXJhY3RlciwgYW5kIGFnZSBncm91cC4gRm9yIGV4YW1wbGUsIGNvbnNpZGVyIGh1bmdlciAodGhlIGZpcnN0IGNhcGFjaXR5IHVuZGVyIF9CT0RZXyk6IEFjcm9zcyBhZ2UgZ3JvdXBzLCBuZWFybHkgZXZlcnkgcGFydGljaXBhbnQgc2FpZCB0aGF0IGEgYmVldGxlIGNvdWxkIGdldCBodW5ncnksIHdoaWxlIGZldyBwYXJ0aWNpcGFudHMgKHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBzb21lIGNoaWxkcmVuKSBzYWlkIHRoYXQgYSByb2JvdCBjb3VsZC4gTGlrZXdpc2UsIGZvciBtYXRoZW1hdGljYWwgY29tcHV0YXRpb25zICh0aGUgbGFzdCBjYXBhY2l0eSB1bmRlciBfTUlORF8pLCB2aXJ0dWFsbHkgbm8gcGFydGljaXBhbnRzIHNhaWQgdGhhdCBhIGJlZXRsZSB3YXMgY2FwYWJsZSBvZiBkb2luZyBtYXRoLCB3aGlsZSB0aGUgdmFzdCBtYWpvcml0eSBvZiBib3RoIGFkdWx0cyBhbmQgY2hpbGRyZW4gc2FpZCB0aGF0IGEgcm9ib3Qgd2FzLiBCdXQgZm9yIHNvY2lhbC1lbW90aW9uYWwgYWJpbGl0aWVzLCBsaWtlIGZlZWxpbmcgcHJvdWQsIGZlZWxpbmcgam95LCBhbmQgZmVlbGluZyBzYWQgKHRoZSBmaXJzdCB0aHJlZSBjYXBhY2l0aWVzIHVuZGVyIF9IRUFSVF8pLCBmYXIgbW9yZSBjaGlsZHJlbiB0aGFuIGFkdWx0cyBlbmRvcnNlZCB0aGVzZSBjYXBhY2l0aWVzIGZvciBiZWV0bGVzIGFuZCByb2JvdHMuIChTZWUgU09NIGZvciBhbiBhbmFseXNpcywgcGFyYWxsZWwgdG8gdGhlIHJlZ3Jlc3Npb24gYW5hbHlzZXMgaGVyZSwgb2YgdGhlIHByb3BvcnRpb24gb2YgdGhlIHRvcC1sb2FkaW5nIG1lbnRhbCBjYXBhY2l0aWVzIGZvciBlYWNoIGZhY3RvciB0aGF0IHdlcmUgZW5kb3JzZWQgYnkgcGFydGljaXBhbnRzIG9mIGRpZmZlcmVudCBhZ2VzLikKCmBgYHtyfQpkMV9hbGwgPC0gZDFfYWQgJT4lCiAgZnVsbF9qb2luKGQxXzc5KSAlPiUKICBzZWxlY3QoYWdlX2dyb3VwLCBzdWJpZCwgY2hhcmFjdGVyLCBjYXBhY2l0eSwgcmVzcG9uc2VfbnVtKSAlPiUKICBsZWZ0X2pvaW4obG9hZGluZ3NfZnVuKGVmYV8zX2QxX2FkKSAlPiUgCiAgICAgICAgICAgICAgZ3JvdXBfYnkoY2FwYWNpdHkpICU+JQogICAgICAgICAgICAgIHRvcF9uKDEsIGxvYWRpbmcpICU+JQogICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUKICAgICAgICAgICAgICBhcnJhbmdlKGZhY3RvciwgZGVzYyhsb2FkaW5nKSkgJT4lCiAgICAgICAgICAgICAgbXV0YXRlKG9yZGVyID0gMTo0MCkgJT4lCiAgICAgICAgICAgICAgc2VsZWN0KGNhcGFjaXR5LCBmYWN0b3IsIG9yZGVyKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShyZXNwb25zZV9udW0pKSAlPiUKICBtdXRhdGUocmVzcG9uc2UgPSByZWNvZGVfZmFjdG9yKHJlc3BvbnNlX251bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwIiA9ICJubyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMC41IiA9ICJraW5kYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMSIgPSAieWVzIiksCiAgICAgICAgIGZhY3RvciA9IHJlY29kZV9mYWN0b3IoZmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGMiIgPSAiQk9EWSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkYxIiA9ICJIRUFSVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkYzIiA9ICJNSU5EIiksCiAgICAgICAgIGFnZV9ncm91cCA9IHJlY29kZV9mYWN0b3IoYWdlX2dyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGlsZHJlbjc5IiA9ICJjaGlsZHJlbiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZHVsdHMiID0gImFkdWx0cyIpKQpgYGAKCmBgYHtyfQpmaWcwM19mdW4gPC0gZnVuY3Rpb24od2hpY2hmYWMpewogIGZpZyA8LSBkMV9hbGwgJT4lCiAgICBmaWx0ZXIoZmFjdG9yID09IHdoaWNoZmFjKSAlPiUKICAgIG11dGF0ZShhZ2VfZ3JvdXAgPSByZWNvZGVfZmFjdG9yKGFnZV9ncm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGlsZHJlbiIgPSAiNy05eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWR1bHRzIiA9ICJhZHVsdHMiKSkgJT4lCiAgICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKGNhcGFjaXR5LCBvcmRlciksCiAgICAgICAgICAgICAgIGZpbGwgPSBjaGFyYWN0ZXIsIGFscGhhID0gcmVzcG9uc2UpKSArCiAgICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKGNoYXJhY3RlciksIHJvd3MgPSB2YXJzKGFnZV9ncm91cCksCiAgICAgICAgICAgICAgIHNjYWxlcyA9ICJmcmVlIiwgc3BhY2UgPSAiZnJlZSIpICsKICAgIGdlb21fYmFyKHBvc2l0aW9uID0gInN0YWNrIikgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiNmYjlhOTkiLCAiIzFmNzhiNCIpKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjZmI5YTk5IiwgIiMxZjc4YjQiKSkgKwogICAgdGhlbWVfYncoKSArCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogICAgbGFicyh0aXRsZSA9IHdoaWNoZmFjLAogICAgICAgICB4ID0gIm1lbnRhbCBjYXBhY2l0eSAoYnkgZmFjdG9yKSIsCiAgICAgICAgIHkgPSAicHJvcG9ydGlvbiBvZiBwYXJ0aWNpcGFudHMiKQogIAogIGlmKHdoaWNoZmFjICE9ICJNSU5EIil7CiAgICBmaWcgPC0gZmlnICsgZ3VpZGVzKGZpbGwgPSAibm9uZSIsIGFscGhhID0gIm5vbmUiKSArIGxhYnMoeCA9ICIiKQogIH0KICAKICByZXR1cm4oZmlnKQp9CgpmaWcwM19CT0RZX3Bsb3QgPC0gZmlnMDNfZnVuKCJCT0RZIikKZmlnMDNfSEVBUlRfcGxvdCA8LSBmaWcwM19mdW4oIkhFQVJUIikKZmlnMDNfTUlORF9wbG90IDwtIGZpZzAzX2Z1bigiTUlORCIpCgpmaWcwM19wbG90cyA8LSBwbG90X2dyaWQoZmlnMDNfQk9EWV9wbG90LCBmaWcwM19IRUFSVF9wbG90LCBmaWcwM19NSU5EX3Bsb3QsCiAgICAgICAgICAgICAgICAgICAgICAgICBucm93ID0gMywgcmVsX2hlaWdodHMgPSBjKDEsIDEuMTEsIDEuMTkpLAogICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gIkFVVE8iKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVCwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDN9CmZpZzAzX3dpdGhfY2FwdGlvbiA8LSBhZGRfc3ViKGZpZzAzX3Bsb3RzLCBzdHJfd3JhcCgiRmlndXJlIDM6IFJhdyBjb3VudHMgb2YgcmVzcG9uc2VzIG9mICd5ZXMnIChkYXJrKSwgJ2tpbmRhJyAobWVkaXVtKSwgb3IgJ25vJyAobGlnaHQpIGZvciBhbGwgbWVudGFsIGNhcGFjaXR5IGl0ZW1zLCBncm91cGVkIGJ5IHRoZSBmYWN0b3Igb24gd2hpY2ggdGhleSBsb2FkaW5nIG1vc3QgcG9zaXRpdmVseSAoQk9EWSwgSEVBUlQsIE1JTkQpIGFjY29yZGluZyB0byBhbiBleHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzaXMgb2YgYWR1bHRzJyByZXNwb25zZXMgKFN0dWR5IDEpLiBFYWNoIHBhcnRpY2lwYW50IGFzc2Vzc2VkIDQwIG1lbnRhbCBjYXBhY2l0aWVzIGZvciBvbmUgb2YgdHdvIHRhcmdldCBjaGFyYWN0ZXJzOiBhIGJlZXRsZSAocGluaykgb3IgYSByb2JvdCAoYmx1ZSkuIDctIHRvIDkteWVhci1vbGQgY2hpbGRyZW4ncyByZXNwb25zZXMgYW5kIGFkdWx0cycgcmVzcG9uc2VzIGFyZSBzaG93biBzZXBhcmF0ZWx5LiIsIDkyKSwgeCA9IDAsIGhqdXN0ID0gMCkKZ2dkcmF3KGZpZzAzX3dpdGhfY2FwdGlvbikKYGBgCgpgYGB7cn0KZDFfYWxsX2VuZG9yc2UgPC0gZDFfYWxsICU+JQogIGdyb3VwX2J5KGZhY3Rvciwgc3ViaWQpICU+JQogIHRvcF9uKC02LCBvcmRlcikgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZShlbmRvcnNlID0gaWZlbHNlKHJlc3BvbnNlX251bSA+IDAsIDEsIDApKSAlPiUKICBncm91cF9ieShhZ2VfZ3JvdXAsIHN1YmlkLCBjaGFyYWN0ZXIsIGZhY3RvcikgJT4lCiAgc3VtbWFyaXNlKHByb3BfZW5kb3JzZSA9IG1lYW4oZW5kb3JzZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgbiA9IGxlbmd0aChlbmRvcnNlKSkgJT4lCiAgdW5ncm91cCgpCgpkMV9hbGxfZW5kb3JzZV9ib290IDwtIGQxX2FsbF9lbmRvcnNlICU+JQogIGdyb3VwX2J5KGFnZV9ncm91cCwgY2hhcmFjdGVyLCBmYWN0b3IpICU+JQogIG11bHRpX2Jvb3Rfc3RhbmRhcmQoY29sID0gInByb3BfZW5kb3JzZSIpICU+JQogIHVuZ3JvdXAoKQoKZmlnU1VQUDFfcGxvdCA8LSBkMV9hbGxfZW5kb3JzZSAlPiUKICBmaWx0ZXIoYWdlX2dyb3VwID09ICJjaGlsZHJlbiIpICU+JQogIGxlZnRfam9pbihkMV83OSAlPiUgZGlzdGluY3Qoc3ViaWQsIGFnZSkpICU+JQogIGZpbHRlcighaXMubmEoYWdlKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYWdlLCB5ID0gcHJvcF9lbmRvcnNlLCAKICAgICAgICAgICAgIGZpbGwgPSBjaGFyYWN0ZXIsIGNvbG9yID0gY2hhcmFjdGVyLCBzaGFwZSA9IGNoYXJhY3RlcikpICsKICBmYWNldF93cmFwKH4gZmFjdG9yKSArCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjQsIHdpZHRoID0gMCwgaGVpZ2h0ID0gMC4wMykgKwogIGJpbm9taWFsX3Ntb290aChhZXMod2VpZ2h0ID0gbiksIHNob3cubGVnZW5kID0gRikgKwogICMgZ2VvbV9zbW9vdGgobWV0aG9kID0gImdsbSIsCiAgIyAgICAgICAgICAgICBtZXRob2QuYXJncyA9IGxpc3QoZmFtaWx5ID0gImJpbm9taWFsIikpICsKICBnZW9tX3BvaW50KGRhdGEgPSBkMV9hbGxfZW5kb3JzZSAlPiUgZmlsdGVyKGFnZV9ncm91cCA9PSAiYWR1bHRzIiksCiAgICAgICAgICAgICBhZXMoeCA9IDExKSwgYWxwaGEgPSAwLjQsIHNob3cubGVnZW5kID0gRiwKICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyZG9kZ2UoZG9kZ2Uud2lkdGggPSAwLjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci5oZWlnaHQgPSAwLjAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaXR0ZXIud2lkdGggPSAwLjI1KSkgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gZDFfYWxsX2VuZG9yc2VfYm9vdCAlPiUgZmlsdGVyKGFnZV9ncm91cCA9PSAiYWR1bHRzIiksCiAgICAgICAgICAgICAgICAgIGFlcyh4ID0gMTEsIHkgPSBtZWFuLCB5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpLCBzaG93LmxlZ2VuZCA9IEYsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgZmF0dGVuID0gNSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKDc6MTEpLCAKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYyhwYXN0ZTAoNzoxMCwgInkiKSwgImFkdWx0cyIpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxLCAxLzYpLCBsYWJlbHMgPSAwOjYpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiI2ZiOWE5OSIsICIjMWY3OGI0IikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjZmI5YTk5IiwgIiMxZjc4YjQiKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDIxLCAyMikpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChhbHBoYSA9IDEsIHNpemUgPSAzKSkpICsKICBsYWJzKHkgPSAibnVtYmVyIG9mIGl0ZW1zIGVuZG9yc2VkIChvdXQgb2YgNikiKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRiwgZmlnLndpZHRoID0gNiwgZmlnLmFzcCA9IDAuN30KZmlnU1VQUDFfd2l0aF9jYXB0aW9uIDwtIGFkZF9zdWIoZmlnU1VQUDFfcGxvdCwgc3RyX3dyYXAoIkZpZ3VyZSBTVVBQMTogTnVtYmVyIG9mIG1lbnRhbCBjYXBhY2l0eSBpdGVtcyAob3V0IG9mIDYpIGVuZG9yc2VkIGluIGVhY2ggZG9tYWluIChCT0RZLCBIRUFSVCwgYW5kIE1JTkQpIGJ5IDctIHRvIDkteWVhci1vbGQgY2hpbGRyZW4gYW5kIGFkdWx0cyBpbiBTdHVkeSAxLCBpbiB3aGljaCBlYWNoIHBhcnRpY2lwYW50IGFzc2Vzc2VkIDQwIG1lbnRhbCBjYXBhY2l0aWVzIGZvciBvbmUgb2YgdHdvIHRhcmdldCBjaGFyYWN0ZXJzOiBhIGJlZXRsZSAocGluayBjaXJjbGVzKSBvciBhIHJvYm90IChibHVlIHNxdWFyZXMpLiBXZSBkZWZpbmVkIGVhY2ggZG9tYWluIGJ5IHRoZSA2IGl0ZW1zIHRoYXQgbG9hZGVkIHRoZSBtb3N0IHBvc2l0aXZlbHkgb24gdGhlIGNvcnJlc3BvbmRpbmcgZmFjdG9yIGluIGFuIGV4cGxvcmF0b3J5IGZhY3RvciBhbmFseXNpcyBvZiBhZHVsdHMnIHJlc3BvbnNlcywgYW5kIHdlIGNvbnNpZGVyZWQgcmVzcG9uc2VzIG9mIGVpdGhlciAneWVzJyBvciAna2luZGEnIChidXQgbm90ICdubycpIHRvIGJlIGVuZG9yc2VtZW50cy4gTGluZXMgY29ycmVzcG9uZCB0byBsb2dpc3RpYyByZWdyZXNzaW9ucyBjb25zaWRlcmluZyBjaGlsZHJlbidzIHNjb3JlcyBhbG9uZS4gRXJyb3IgYmFycyBhcmUgYm9vdHN0cmFwcGVkIDk1JSBjb25maWRlbmNlIGludGVydmFscyBvbiBhZHVsdHMnIHNjb3Jlcy4iLCAxMzApLCB4ID0gMCwgaGp1c3QgPSAwKQpnZ2RyYXcoZmlnU1VQUDFfd2l0aF9jYXB0aW9uKQpgYGAKCiMjIyMgQWdlIGRpZmZlcmVuY2VzIHdpdGhpbiB0aGUgY2hpbGQgc2FtcGxlCgpPZiBjb3Vyc2UsIG91ciBzYW1wbGUgb2YgImNoaWxkcmVuIiBpbmNsdWRlZCBwYXJ0aWNpcGFudHMgYXMgeW91bmcgYXMgNyB5ZWFycyBhbmQgdXAgdG8gbmVhcmx5IDEwIHllYXJzIG9mIGFnZS4gSG93IGRpZCBhdHRyaWJ1dGlvbnMgdmFyeSBhY3Jvc3MgdGhpcyBhZ2UgcmFuZ2U/IAoKYGBge3J9CmQxX2NoX2FnZSA8LSBkMV83OSAlPiUgZGlzdGluY3Qoc3ViaWQsIGFnZSkKYGBgCgpgYGB7cn0KIyBlZmFfM19zY29yZXNfcl9kMV83OSA8LSBicm0oc2NvcmUgfiBmYWN0b3JfbmFtZSAqIGFnZSAqIGNoYXJhY3RlcgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgxfHN1YmlkKSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGVmYV8zX3Njb3Jlc19kMV9hbGwgJT4lCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGFnZV9ncm91cCA9PSAiY2hpbGRyZW43OSIsICFpcy5uYShhZ2UpKSAlPiUKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoYWdlID0gc2NhbGUoYWdlLCBzY2FsZSA9IEYpKSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlZCA9IDEyMzQ1LAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlcyA9IDQsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45OSkpCiMgc2F2ZVJEUyhlZmFfM19zY29yZXNfcl9kMV83OSwgZmlsZSA9ICIuL2JybXNfbW9kZWxzL2VmYV8zX3Njb3Jlc19yX2QxXzc5LnJkcyIpCgplZmFfM19zY29yZXNfcl9kMV83OSA8LSByZWFkUkRTKCIuL2JybXNfbW9kZWxzL2VmYV8zX3Njb3Jlc19yX2QxXzc5LnJkcyIpCiMgc3VtbWFyeShlZmFfM19zY29yZXNfcl9kMV83OSkKYGBgCgpUbyBleHBsb3JlIGFnZS1yZWxhdGVkIGRpZmZlcmVuY2VzIGNvbnRpbnVvdXNseSB3aXRoaW4gdGhlIGNoaWxkIHNhbXBsZSwgd2UgY29uZHVjdGVkIGFuIGFkZGl0aW9uYWwgcmVncmVzc2lvbiBhbmFseXNpcyBvbiBjaGlsZHJlbidzIGZhY3RvciBzY29yZXMgYWxvbmUsIGluY2x1ZGluZyBpbnRlcmFjdGlvbnMgd2l0aCBleGFjdCBhZ2UgaW4geWVhcnMgKGNlbnRlcmVkIGF0IHRoZSBtZWFuOiBgciBmb3JtYXQocm91bmQobWVhbihkMV9jaF9hZ2UkYWdlLCBuYS5ybSA9IFQpLCAyKSwgbnNtYWxsID0gMilgeSkgcmF0aGVyIHRoYW4gYWdlIGdyb3VwLiBJbiBsaW5lIHdpdGggdGhlIGFnZSBncm91cCBhbmFseXNpcyBkZXNjcmliZWQgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24sIHRoaXMgY29uZmlybWVkIHRoYXQsIHJlbGF0aXZlIHRvIHRoZSBncmFuZCBtZWFuLCBhdHRyaWJ1dGlvbnMgb2YgX0hFQVJUXyBkZWNyZWFzZWQgd2l0aCBhZ2UgKGByIHdyaXRlX2JfOTVDSV9mdW4oZWZhXzNfc2NvcmVzX3JfZDFfNzksICJmYWN0b3JfbmFtZUhfR006YWdlIilgKSBhbmQgYXR0cmlidXRpb25zIG9mIF9NSU5EXyBpbmNyZWFzZWQgd2l0aCBhZ2UgKGByIHdyaXRlX2JfOTVDSV9mdW4oZWZhXzNfc2NvcmVzX3JfZDFfNzksICJmYWN0b3JfbmFtZU1fR006YWdlIilgKS4gKFNlZSBUYWJsZSAyIGZvciB0aGUgZnVsbCByZXN1bHRzIG9mIHRoaXMgbW9kZWwuKQoKYGBge3IsIGluY2x1ZGUgPSBULCByZXN1bHRzID0gImFzaXMifQpmaXhlZihlZmFfM19zY29yZXNfcl9kMV83OSkgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiUGFyYW1ldGVyIikgJT4lCiAgbXV0YXRlKFBhcmFtZXRlciA9IHJlY29kZV9mYWN0b3IoUGFyYW1ldGVyLAogICAgIkludGVyY2VwdCIgPSAiKEludGVyY2VwdCkiLAogICAgImNoYXJhY3RlclJfR00iID0gImNoYXJhY3RlciAocm9ib3QgdnMuIGdyYW5kIG1lYW4pIiwKICAgICJmYWN0b3JfbmFtZUhfR00iID0gIkhFQVJUICh2cy4gZ3JhbmQgbWVhbikiLAogICAgImZhY3Rvcl9uYW1lTV9HTSIgPSAiTUlORCAodnMuIGdyYW5kIG1lYW4pIiwKICAgICJmYWN0b3JfbmFtZUhfR006Y2hhcmFjdGVyUl9HTSIgPSAiY2hhcmFjdGVyIMOXIEhFQVJUIiwKICAgICJmYWN0b3JfbmFtZU1fR006Y2hhcmFjdGVyUl9HTSIgPSAiY2hhcmFjdGVyIMOXIE1JTkQiLAogICAgImFnZSIgPSAiYWdlIChtZWFuLWNlbnRlcmVkKSIsCiAgICAiYWdlOmNoYXJhY3RlclJfR00iID0gImNoYXJhY3RlciDDlyBhZ2UiLAogICAgImZhY3Rvcl9uYW1lSF9HTTphZ2UiID0gIkhFQVJUIMOXIGFnZSIsCiAgICAiZmFjdG9yX25hbWVNX0dNOmFnZSIgPSAiTUlORCDDlyBhZ2UiLAogICAgImZhY3Rvcl9uYW1lSF9HTTphZ2U6Y2hhcmFjdGVyUl9HTSIgPSAiY2hhcmFjdGVyIMOXIEhFQVJUIMOXIGFnZSIsCiAgICAiZmFjdG9yX25hbWVNX0dNOmFnZTpjaGFyYWN0ZXJSX0dNIiA9ICJjaGFyYWN0ZXIgw5cgTUlORCDDlyBhZ2UiKSkgJT4lCiAgYXJyYW5nZShQYXJhbWV0ZXIpICU+JQogIG11dGF0ZShYID0gaWZlbHNlKFEyLjUgKiBROTcuNSA+IDAsICIqIiwgIiIpKSAlPiUKICBtdXRhdGVfYXQodmFycygtUGFyYW1ldGVyLCAtWCksCiAgICAgICAgICAgIGZ1bnMoZm9ybWF0KHJvdW5kKC4sIDIpLCBuc21hbGwgPSAyKSkpICU+JQogIHJlbmFtZShiID0gRXN0aW1hdGUsIEVycm9yID0gRXN0LkVycm9yLCAiICIgPSBYKSAlPiUKICB1bml0ZShgOTUlIENJYCwgUTIuNSwgUTk3LjUsIHNlcCA9ICIsICIpICU+JQogIG11dGF0ZShgOTUlIENJYCA9IHBhc3RlMCgiWyIsIGA5NSUgQ0lgLCAiXSIpKSAlPiUKICBrbml0cjo6a2FibGUoZm9ybWF0ID0gImh0bWwiLCBhbGlnbiA9IGMoImwiLCByZXAoInIiLCAzKSksCiAgICAgICAgICAgICAgIGNhcHRpb24gPSAiVGFibGUgMjogRml4ZWQgZWZmZWN0cyBmcm9tIGEgbWl4ZWQtZWZmZWN0cyBCYXllc2lhbiByZWdyZXNzaW9uIG1vZGVsIG9mIGNoaWxkcmVuJ3MgcmVzcG9uc2VzLCBwcmVkaWN0aW5nIGZhY3RvciBzY29yZXMgaW4gU3R1ZHkgMSBieSBjaGFyYWN0ZXIgKGJlZXRsZSwgcm9ib3QpLCBmYWN0b3IgKEJPRFksIEhFQVJULCBNSU5EKSwgYW5kIGV4YWN0IGFnZS4gVGhlIG1vZGVsIHVzZWQgdGhlIGZvcm11bGEgJ2ZhY3RvciBzY29yZSB+IGZhY3RvciAqIGFnZSAqIGNoYXJhY3RlciArICgxIHwgc3ViamVjdCknIGFuZCB3YXMgaW1wbGVtZW50ZWQgaW4gdGhlICdicm1zJyBwYWNrYWdlIGZvciBSIChCw7xya25lciwgMjAxNykuIEZhY3RvciBhbmQgY2hhcmFjdGVyIHdlcmUgZWZmZWN0LWNvZGVkLCBhbmQgYWdlIHdhcyBtZWFuLWNlbnRlcmVkLiBBc3Rlcmlza3MgbWFyayBwYXJhbWV0ZXJzIHdob3NlIDk1JSBjcmVkaWJsZSBpbnRlcnZhbCBkb2VzIG5vdCBpbmNsdWRlIDAuIikgJT4lCiAga2FibGVfc3R5bGluZygpICU+JQogIGdyb3VwX3Jvd3MoIkNvbGxhcHNpbmcgYWNyb3NzIGFnZSIsIDEsIDYpICU+JQogIGdyb3VwX3Jvd3MoIkFnZSBlZmZlY3RzIiwgNywgMTIpCmBgYAoKSW5kZWVkLCB2aXN1YWwgaW5zcGVjdGlvbiBvZiBGaWd1cmUgNCBzdWdnZXN0cyB0aGF0LCBhY3Jvc3MgYWxsIHRocmVlIGRvbWFpbnMgKF9CT0RZXywgX0hFQVJUXywgYW5kIF9NSU5EXyksIGNoaWxkcmVuJ3MgbWVudGFsIGNhcGFjaXR5IGF0dHJpYnV0aW9ucyB0byBiZWV0bGVzIGFuZCByb2JvdHMgYXBwZWFyZWQgdG8gYmVjb21lIG1vcmUgYWR1bHQtbGlrZSB3aXRoIGFnZeKAlGJ1dCB3aGlsZSB0aGUgb2xkZXN0IGNoaWxkcmVuIHdlcmUgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhZHVsdHMgaW4gdGhlIF9CT0RZXyBhbmQgX01JTkRfIGRvbWFpbnMsIGV2ZW4gdGhlIG9sZGVzdCBjaGlsZHJlbiBhcHBlYXIgdG8gaGF2ZSBhdHRyaWJ1dGVkIG1vcmUgc29jaWFsLWVtb3Rpb25hbCBhYmlsaXRpZXMgdG8gdGhlc2UgZW50aXRpZXMgdGhhbiBtb3N0IGFkdWx0cyBkaWQuCgpgYGB7cn0KZmlnMDRfcGxvdCA8LSBnZ3Bsb3QoZWZhXzNfc2NvcmVzX2QxX2FsbCAlPiUgZmlsdGVyKCFpcy5uYShhZ2UpKSwKICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBhZ2UsIHkgPSBzY29yZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBjaGFyYWN0ZXIsIGNvbG9yID0gY2hhcmFjdGVyLCBzaGFwZSA9IGNoYXJhY3RlcikpICsKICBmYWNldF93cmFwKH4gZmFjdG9yX25hbWUsIHNjYWxlcyA9ICJmcmVlIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDIpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC4yKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgYWxwaGEgPSAwLjI1LCBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3BvaW50KGRhdGEgPSBlZmFfM19zY29yZXNfZDFfYWxsICU+JSBmaWx0ZXIoYWdlX2dyb3VwID09ICJhZHVsdHMiKSwKICAgICAgICAgICAgIGFlcyh4ID0gMTEpLCBhbHBoYSA9IDAuMiwgc2hvdy5sZWdlbmQgPSBGLAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJkb2RnZShkb2RnZS53aWR0aCA9IDAuNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci53aWR0aCA9IDAuMjUpKSArCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSBlZmFfM19zY29yZXNfYm9vdF9kMV9hbGwgJT4lIGZpbHRlcihhZ2VfZ3JvdXAgPT0gImFkdWx0cyIpLAogICAgICAgICAgICAgICAgICBhZXMoeCA9IDExLCB5ID0gbWVhbiwgeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLAogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSwgc2hvdy5sZWdlbmQgPSBGLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGZhdHRlbiA9IDEuMjUpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYyg3OjExKSwgCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMocGFzdGUwKDc6MTAsICJ5IiksICJhZHVsdHMiKSkgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoLTEwLCAxMCwgMSkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiI2ZiOWE5OSIsICIjMWY3OGI0IikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjZmI5YTk5IiwgIiMxZjc4YjQiKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDIxLCAyMikpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChhbHBoYSA9IDEsIHNpemUgPSAzKSkpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBULCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC41fQpmaWcwNF93aXRoX2NhcHRpb24gPC0gYWRkX3N1YihmaWcwNF9wbG90LCBzdHJfd3JhcCgiRmlndXJlIDQ6IEZhY3RvciBzY29yZXMgZm9yIGFkdWx0cyBhbmQgNy0gdG8gOS15ZWFyLW9sZCBjaGlsZHJlbiBpbiBTdHVkeSAxLCByZXBsb3R0ZWQgdG8gaWxsdXN0cmF0ZSBhZ2UgZWZmZWN0cyB3aXRoaW4gdGhlIGNoaWxkIHNhbXBsZS4gTGluZXMgY29ycmVzcG9uZCB0byBsaW5lYXIgcmVncmVzc2lvbnMgY29uc2lkZXJpbmcgY2hpbGRyZW4ncyBzY29yZXMgYWxvbmUuIEVycm9yIGJhcnMgYXJlIGJvb3RzdHJhcHBlZCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMgb24gYWR1bHRzJyBzY29yZXMuIE5vdGUgdGhhdCB0aGUgcmFuZ2Ugb2YgdGhlIHktYXhpcyBkaWZmZXJzIGFjcm9zcyBwYW5lbHMuIiwgMTM1KSwgeCA9IDAsIGhqdXN0ID0gMCkKZ2dkcmF3KGZpZzA0X3dpdGhfY2FwdGlvbikKYGBgCgpUYWtlbiB0b2dldGhlciwgdGhlc2UgYW5hbHlzZXMgY29udmVyZ2UgdG8gc3VnZ2VzdCBvbmx5IG1pbm9yIGRpZmZlcmVuY2VzIGJldHdlZW4gY2hpbGRyZW4gYW5kIGFkdWx0cyBpbiB0aGVpciBhdHRyaWJ1dGlvbnMgb2YgX0JPRFlfIGFuZCBfTUlORF8gdG8gYmVldGxlcyBhbmQgcm9ib3Rz4oCUYnV0IGEgbWFqb3IgZGlmZmVyZW5jZSBpbiBfSEVBUlRfOiBSZWxhdGl2ZSB0byBhZHVsdHMsIGNoaWxkcmVuIHRlbmRlZCB0byBjcmVkaXQgYm90aCBiZWV0bGVzIGFuZCByb2JvdHMgd2l0aCBtdWNoIGdyZWF0ZXIgc29jaWFsLWVtb3Rpb25hbCBhYmlsaXRpZXMuIAoKIyMgRGlzY3Vzc2lvbgoKU3R1ZHkgMSBzaGVkIGxpZ2h0IG9uIHR3byBkaXN0aW5jdCBhc3BlY3RzIG9mIHRoZSBkZXZlbG9wbWVudCBvZiBjaGlsZHJlbidzIGNvbmNwZXR1YWwgcmVwcmVzZW50YXRpb25zIG9mIG1lbnRhbCBsaWZlOiBjb250aW51aXR5IGluIHRoZSB1bmRlcmx5aW5nIGNvbmNlcHR1YWwgX3N0cnVjdHVyZV8gYW5kIHZhcmlhYmlsdHkgaW4gdGhlIF9hcHBsaWNhdGlvbl8gb2YgdGhlc2UgY29uY2VwdHMuIAoKIyMjIENvbmNlcHR1YWwgc3RydWN0dXJlIGlzIGFkdWx0bGlrZSBhdCA3LTl5CgpPbiB0aGUgb25lIGhhbmQsIGV4cGxvcmF0b3J5IGZhY3RvciBhbmFseXNlcyBzdWdnZXN0ZWQgdGhhdCBieSBtaWRkZGxlIGNoaWxkaG9vZCAoNy05eSksIHRoZSBjb25jZXB0dWFsIHN0cnVjdHVyZSB1bmRlcmx5aW5nIFVTIGNoaWxkcmVuJ3MgYXR0cmlidXRpb25zIG9mIG1lbnRhbCBsaWZlIGlzIHZlcnkgc2ltaWxhciB0byB0aGF0IG9mIFVTIGFkdWx0cywgYW5jaG9yZWQgYnkgc3VpdGVzIG9mIG1lbnRhbCBjYXBhY2l0aWVzIHJlbGF0ZWQgdG8gX0JPRFlfIChwaHlzaW9sb2dpY2FsIHNlbnNhdGlvbnMpLCBfSEVBUlRfIChzb2NpYWwtZW1vdGlvbmFsIGFiaWxpdGllcyksIGFuZCBfTUlORF8gKHBlcmNlcHR1YWwtY29nbml0aXZlIGFiaWxpdGllcykuIFdlIG5vdGUgdGhhdCwgaW4gcHJpbmNpcGxlLCBhIG51bWJlciBvZiBhZGRpdGlvbmFsIG9yIGFsdGVybmF0aXZlIGxhdGVudCBmYWN0b3JzIGNvdWxkIGhhdmUgZW1lcmdlZCBmcm9tIHRoZSBmYWN0b3IgYW5hbHlzaXMgb2YgY2hpbGRyZW4ncyByZXNwb25zZXMuIEZvciBleGFtcGxlLCBjaGlsZHJlbiBtaWdodCBoYXZlIGRpc3Rpbmd1aXNoZWQgcHJpbWFyaWx5IGJldHdlZW4gaW50ZXJuYWwgZXhwZXJpZW5jZSBhbmQgZXh0ZXJuYWwgYWN0aW9uIChHcmF5IGV0IGFsLiwgMjAwNyksIG9yIHRoZXkgbWlnaHQgaGF2ZSBkZW1vbnN0cmF0ZWQgZmluZXItZ3JhaW5lZCBncm91cGluZ3Mgb2YgbWVudGFsIGNhcGFjaXRpZXMgYmFzZWQgb24gcGhyYXNpbmcsIHJvdGUga25vd2xlZGdlLCBldGMuIEluc3RlYWQsIHRoZSBsYXRlbnQgY29uY2VwdHVhbCBzdHJ1Y3R1cmUgdW5kZXJseWluZyBjaGlsZHJlbidzIHJlc3BvbnNlcyBhcHBlYXJzIHRvIGJlIHZlcnkgc2ltaWxhciB0byB0aGF0IG9mIGFkdWx0cywgYm90aCBpbiB0aGlzIHN0dWR5IGFuZCBpbiBXZWlzbWFuIGV0IGFsLidzICgyMDE3KSBwcmV2aW91cyB3b3JrLiBJbiBvdGhlciB3b3JkcywgYW55IGRyYW1hdGljIGRldmVsb3BtZW50YWwgY2hhbmdlcyB0byB0aGlzIGNvbmNlcHR1YWwgc3RydWN0dXJlIGxpa2VseSBvY2N1ciBwcmlvciB0byB0aGUgYWdlIG9mIDcgeWVhcnMuCgojIyMgQXR0cmlidXRpb25zIG9mIF9IRUFSVF8gdW5kZXJnbyBkcmFtYXRpYyBkZXZlbG9wbWVudCBleHRlbmRpbmcgd2VsbCBpbnRvIG1pZGRsZSBjaGlsZGhvb2QKCk9uIHRoZSBvdGhlciBoYW5kLCBhbmFseXNlcyBvZiBjaGlsZHJlbidzIGF0dHJpYnV0aW9ucyB3aXRoaW4gdGhpcyBzaGFyZWQgY29uY2VwdHVhbCBzdHJ1Y3R1cmUgc3VnZ2VzdGVkIHRoYXQgdGhlaXIgYXBwbGljYXRpb24gb2YgdGhpcyBjb25jZXB04oCUaW4gcGFydGljdWxhciwgdGhlaXIgYXR0cmlidXRpb25zIG9mIHRoZSBzb2NpYWwtZW1vdGlvbmFsIGFiaWxpdGllcyBvZiB0aGUgX0hFQVJUX+KAlG1heSBiZSB1bmRlcmdvaW5nIHN1YnN0YW50aWFsIHJlZmluZW1lbnQgdGhyb3VnaCBtaWRkbGUgY2hpbGRob29kLiBUaGUgc3BlY2lmaWNpdHkgb2YgdGhpcyBhZ2UgZGlmZmVyZW5jZeKAlHdoaWNoIGVtZXJnZWQgZHJhbWF0aWNhbGx5IGluIG9uZSBkb21haW4gKF9IRUFSVF8pLCBidXQgbm90IG90aGVycyAoX0JPRFlfLCBfTUlORF8p4oCUc3VnZ2VzdHMgdGhhdCB0aGlzIGlzIHVubGlrZWx5IHRvIGJlIGR1ZSBlaXRoZXIgdG8gYSBnZW5lcmFsIHRlbmRlbmN5IHRvd2FyZCAibWVudGFsaXppbmciIHRoZXNlIGNoYXJhY3RlcnMgKG9yIGEgc2ltcGxlICJ5ZXMiIGJpYXMpLiBCdXQgaXRzIGV4dGVuc2lvbiB0byBib3RoIGJlZXRsZXMgYW5kIHJvYm90cyByYWlzZXMgbWFueSBxdWVzdGlvbnMuIFdpdGggcmVnYXJkIHRvIHJvYm90cywgY2hpbGRyZW4gZ3Jvd2luZyB1cCBpbiB0aGUgMjFzdCBjZW50dXJ5IG1pZ2h0IGJlIGNvbnZlcmdpbmcgb24gYSBuZXcgdW5kZXJzdGFuZGluZyBvZiB0ZWNobm9sb2dpY2FsICJiZWluZ3MiIGFzIGluYW5pbWF0ZSBvYmplY3RzIHdpdGggc29tZSBkZWdyZWUgb2Ygc29jaWFsLWVtb3Rpb25hbCBsaWZlIChzZWUgS2FobiwgR2FyeSwgJiBTaGVuLCAyMDEzKeKAlGJ1dCB0aGlzIGtpbmQgb2YgaGlzdG9yaWNhbCBjb25jZXB0dWFsIGNoYW5nZSB3b3VsZCBub3QgcHJlZGljdCB0aGUgaGlnaCByYXRlcyBvZiBzb2NpYWwtZW1vdGlvbmFsIGF0dHJpYnV0aW9ucyB0byBiZWV0bGVzIHRoYXQgd2Ugb2JzZXJ2ZWQuIE91ciBmaW5kaW5ncyBhcmUgcGVyaGFwcyBtb3JlIGNvbnNpc3RlbnQgd2l0aCBhIGdlbmVyYWwgb3Blbm5lc3MgdG8gdW50cmFkaXRpb25hbCBzb2NpYWwgcGFydG5lcnMgdGhhdCBleHRlbmRzIGludG8gbWlkZGxlIGNoaWxkaG9vZCAoYnV0IG5vdCBhZHVsdGhvb2Qp4oCUb3Igd2l0aCBhIGRpZmZlcmVuY2UgaW4gY29uc3RydWFscyBvZiB3aGF0IGl0IG1lYW5zIHRvIGZlZWwgcHJvdWQsIGhhcHB5LCBndWlsdHksIGV0Yy4gVG8gd2hhdCBraW5kcyBvZiBlbnRpdGllcyB3b3VsZCBjaGlsZHJlbiBvZiB0aGlzIGFnZSBkZW55IHNvY2lhbC1lbW90aW9uYWwgYWJpbGl0aWVzLCBhbmQgaG93IGRvIHRoZXkgZHJhdyB0aGlzIGxpbmU/IEhvdyB3b3VsZCB5b3VuZ2VyIGNoaWxkcmVuJ3MgYXR0cmlidXRpb25zIG9mIF9IRUFSVF8gKGFzIHdlbGwgYXMgX0JPRFlfIGFuZCBfTUlORF8pIGNvbXBhcmU/CgojIFN0dWR5IDIKClRoZSBnb2FscyBvZiBTdHVkeSAyIHdlcmUgdGhyZWVmb2xkLiAKCkZpcnN0LCB3ZSBhaW1lZCB0byBleHRlbmQgb3VyIGZpbmRpbmdzIHdpdGggNy0gdG8gOS15ZWFyLW9sZCBjaGlsZHJlbiBpbiBTdHVkeSAxLCBieSBleHBhbmRpbmcgdGhlIGxpc3Qgb2YgdGhlIHRhcmdldCBjaGFyYWN0ZXJzIHRvIGluY2x1ZGUgbm90IG9ubHkgdGhlIHR3byAiZWRnZSBjYXNlcyIgZnJvbSBTdHVkeSAxIChhIGJlZXRsZSBhbmQgYSByb2JvdCksIGJ1dCBhIGFsc28gYSB3aWRlciByYW5nZSBvZiBhbmltYXRlIGJlaW5ncyAoYSBiaXJkLCBhIGdvYXQsIGFuZCBhbiBlbGVwaGFudCkgYW5kIGluYW5pbWF0ZSBvYmplY3RzIChhIGNvbXB1dGVyLCBhIHRlZGR5IGJlYXIsIGFuZCBhIGRvbGwpLiBJbiBjb250cmFzdCB0byBTdHVkeSAxLCB3aGVyZSB3ZSB0cmFja2VkIHdoaWNoIG1lbnRhbCBjYXBhY2l0aWVzICJoYW5nIHRvZ2V0aGVyIiB3aGVuIHBhcnRpY2lwYW50cyByZWFzb25lZCBhYm91dCBjb250cm92ZXJzaWFsICJlZGdlIGNhc2VzIiBpbiBzb2NpYWwgcmVhc29uaW5nLCBTdHVkeSAyIGFsbG93ZWQgdXMgdG8gdHJhY2sgd2hpY2ggbWVudGFsIGNhcGFjaXRpZXMgImhhbmcgdG9nZXRoZXIiIHdoZW4gdGFyZ2V0IGNoYXJhY3RlcnMgYXJlIHBlcmNlaXZlZCB0byB2YXJ5IGluIHRoZWlyIG1lbnRhbCBjYXBhY2l0eSBwcm9maWxlcy4gSW4gV2Vpc21hbiBldCBhbC4ncyBvcmlnaW5hbCBzdHVkaWVzLCB0aGlzIGFwcHJvYWNoIHlpZWxkZWQgYSBoaWdobHkgc2ltaWxhciBjb25jZXB0dWFsIHN0cnVjdHVyZSB0byB0aGUgImVkZ2UgY2FzZSIgYXBwcm9hY2ggKFdlaXNtYW4gZXQgYWwuLCAyMDE3OyBTdHVkeSA0KS4gV2UgcmVhc29uZWQgdGhhdCBpZiB0aGlzIHRocmVlLXBhcnQgY29uY2VwdHVhbCBzdHJ1Y3R1cmUgaXMgc3RhYmxlIGFuZCByb2J1c3QgYnkgdGhlIGFnZSBvZiA3LTkgeWVhcnMsIGl0IHNob3VsZCBtYW5pZmVzdCBhbW9uZyA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuIHVuZGVyIHRoZSBzYW1lIHJhbmdlIG9mIGNvbmRpdGlvbnMgdGhhdCBpdCBkb2VzIGFtb25nIGFkdWx0cy4gCgpPdXIgc2Vjb25kIGdvYWwgd2FzIHRvIGFzc2VzcyB0aGUgZWFybGllciBkZXZlbG9wbWVudCBvZiBjb25jZXB0dWFsIHN0cnVjdHVyZSBpbiBhIGdyb3VwIG9mIHlvdW5nZXIgY2hpbGRyZW4uIFdlIHRhcmdldGVkIDQtIHRvIDYteWVhci1vbGQgY2hpbGRyZW4gZm9yIG91ciB5b3VuZ2VyIGFnZSBncm91cCBiZWNhdXNlIHRoaXMgaGFzIGJlZW4gaWRlbnRpZmllZCBhcyBhIHBlcmlvZCBvZiBkcmFtYXRpYyBkZXZlbG9wbWVudCBpbiBzZXZlcmFsIHJlbGV2YW50IGRvbWFpbnMuIE1hbnkgc3R1ZGllcyBoYXZlIGRvY3VtZW50ZWQgc2hpZnRzIGluIGNoaWxkcmVuJ3MgYWJpbGl0aWVzIHRvIHRha2Ugb3RoZXJzJyBwZXJzcGVjdGl2ZXMsIHJlcHJlc2VudCBmYWxzZSBiZWxpZWZzLCBhbmQgaW50ZWdyYXRlIHJlcHJlc2VudGF0aW9ucyBvZiBpbnRlbnRpb25zIGFuZCBvdXRjb21lcyBpbiBldmFsdWF0aW5nIG1vcmFsIHJlc3BvbnNpYmlsaXR5IChmb3IgcmV2ZWl3cywgc2VlIEZsYXZlbGwsIDE5OTk7IFdlbGxtYW4sIDIwMTUpLiBUaGUgcHJlc2Nob29sIHllYXJzIGhhdmUgYWxzbyBiZWVuIHRoZSBmb2N1cyBvZiBhIHJpY2ggdHJhZGl0aW9uIG9mIHdvcmsgb24gbGF5IGJpb2xvZ3kgYW5kIHRoZSBhbmltYXRlLWluYW5pbWF0ZSBkaXN0aW5jdGlvbiBleHRlbmRpbmcgYmFjayBuZWFybHkgYSBjZW50dXJ5IChlLmcuLCBDYXJleSwgMTk4NTsgUi4gR2VsbWFuLCBTcGVsa2UsICYgTWVjaywgMTk4MzsgTWVkaW4sIFdheG1hbiwgV29vZHJpbmcsICYgV2FzaGluYXdhdG9rLCAyMDEwOyBQaWFnZXQsIDE5Mjk7IGZvciBhIHJldmlldywgc2VlIFMuIEdlbG1hbiAmIE9wZmVyLCAyMDAyKS4gQWxsIG9mIHRoZXNlIGFjY291bnRzIG1ha2UgdGhlIGNhc2UgdGhhdCBiZWNvbWluZyBhIHNvcGhpc3RpY2F0ZWQgcmVhc29uZXLigJRhbmQgcGFydGljdWxhcmx5IGEgc29waGlzdGljYXRlZCBzb2NpYWwgcmVhc29uZXLigJRyZXF1aXJlcyBzdWJzdGFudGlhbCByZWZpbmVtZW50IG9mIG9uZSdzIHJlcHJlc2VudGF0aW9ucyBvZiBvdGhlcnMnIGV4cGVyaWVuY2VzLCBiZWxpZWZzLCBkZXNpcmVzLCBhbmQgbmVlZHMuIE1pZ2h0IHRoZXNlIHJlZmluZW1lbnRzIGluY2x1ZGUgY2hhbmdlcyB0byB0aGUgc3RydWN0dXJlIG9mIGNoaWxkcmVuJ3MgY29uY2VwdHMgb2YgbWVudGFsIGxpZmU/IAoKT3VyIHRoaXJkIGdvYWwgd2FzIHRvIGV4YW1pbmUgYWdlLXJlbGF0ZWQgY2hhbmdlcyBpbiB3aGljaCBtZW50YWwgY2FwYWNpdGllcyB0ZW5kIHRvIGJlIGF0dHJpYnV0ZWQgdG8gd2hpY2ggdGFyZ2V0IGNoYXJhY3RlcnMuIEluIHN1bW1hcml6aW5nIHRoZSByZXN1bHRzIG9mIFN0dWR5IDEsIHdlIGRpc2N1c3NlZCBtZW50YWwgY2FwYWNpdHkgYXR0cmlidXRpb25zIGFzIHRoZSAiYXBwbGljYXRpb24iIG9mIGNvbmNlcHRzIG9mIG1lbnRhbCBsaWZlLCBpbiBjb250cmFzdCB0byB0aGUgY29uY2VwdHVhbCAic3RydWN0dXJlIiByZXZlYWxlZCBieSBleHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzaXMuIEJ5IGV4cGFuZGluZyB0aGUgcmFuZ2Ugb2YgdGFyZ2V0IGNoYXJhY3RlcnMgaW5jbHVkZWQgaW4gdGhlIHN0dWR5LCBTdHVkeSAyIHByb3ZpZGVzIGFuIG9wcG9ydHVuaXR5IHRvIGV4cGxvcmUgY2hhbmdlcyBpbiBob3cgY2hpbGRyZW4gYXBwbHkgdGhlaXIgZGV2ZWxvcGluZyBjb25jZXB0cyBvZiBtZW50YWwgbGlmZSB0byBhIHZhcmlldHkgb2YgYW5pbWF0ZSBiZWluZ3MgYW5kIGluYW5pbWF0ZSBvYmplY3RzLgoKIyMgTWV0aG9kCgojIyMgUGFydGljaXBhbnRzCgpgciBucm93KGQyX2FkX3dpZGUpICsgbnJvdyhkMl83OV93aWRlKSArIG5yb3coZDJfNDZfd2lkZSlgIHBlb3BsZSBwYXJ0aWNpcGF0ZWQgaW4gdGhpcyBzdHVkeSwgaW5jbHVkaW5nIGEgZ3JvdXAgb2YgYWR1bHRzLCBhIGdyb3VwIG9mICJvbGRlciIgY2hpbGRyZW4gKDctOXkpLCBhbmQgYSBncm91cCBvZiAieW91bmdlciIgY2hpbGRyZW4gKDQtNnkpLgoKYGBge3J9CiMgZGVtb2dyYXBoaWNzCmQyX2FkX2dlbmRlciA8LSBkZW1vX2Z1bihkMl9hZCwgImdlbmRlciIsIDIpCmQyX2FkX2V0aG5pY2l0eSA8LSBkZW1vX2Z1bihkMl9hZCwgImV0aG5pY2l0eV9jYXQiLCAyKQpgYGAKCkFkdWx0cyAoX25fPWByIG5yb3coZDJfYWRfd2lkZSlgKSBwYXJ0aWNpcGF0ZWQgdmlhIE1UdXJrIGluIFNlcHRlbWJlciAyMDE4LiBBZHVsdCBwYXJ0aWNpcGFudHMgaGFkIGdhaW5lZCBhcHByb3ZhbCBmb3IgYXQgbGVhc3QgOTUlIG9mIHRoZWlyIHByZXZpb3VzIHdvcmsgb24gTVR1cms7IGhhZCBNVHVyayBhY2NvdW50cyBiYXNlZCBpbiB0aGUgVVM7IGFuZCBpbmRpY2F0ZWQgdGhhdCB0aGV5IHdlcmUgYXQgbGVhc3QgMTggeWVhcnMgb2xkLiBBZHVsdHMgd2VyZSBwYWlkIFwkMC40NSBmb3IgYXBwcm94aW1hdGVseSAyLTQgbWludXRlcyBvZiB0aGVpciB0aW1lIChtZWRpYW4gZHVyYXRpb246IGByIHN1bW1hcnkoZDJfYWQkZHVyYXRpb24pWyJNZWRpYW4iXSAlPiUgcm91bmQoMilgIG1pbikuIEFuIGFkZGl0aW9uYWwgMjIgYWR1bHRzIHBhcnRpY2lwYXRlZCBidXQgd2VyZSBleGNsdWRlZCBmb3IgZmFpbGluZyB0byByZXNwb25kIHNlbnNpYmx5IHRvIGFuIG9wZW4tZW5kZWQgcXVlc3Rpb24gYWJvdXQgd2hhdCB0aGV5IGhhZCBiZWVuIGFza2VkIHRvIGRvIGluIHRoZSBzdHVkeSAoZS5nLiwgY29weWluZyBhbmQgcGFzdGluZyB0ZXh0IGZyb20gdGhlIHF1ZXN0aW9uLCB3cml0aW5nICJnb29kIHN0dWR5LCIgb3IgZGVzY3JpYmluZyBhIGRpZmZlcmVudCBzdHVkeSwgZS5nLiwgIkkgd3JvdGUgYW4gZXNzYXkgYWJvdXQgbmF0dXJlIjsgX25fPTExKSBvciBmb3IgZmFpbGluZyB0byBwYXNzIG9uZSBvciBtb3JlIGF0dGVudGlvbiBjaGVja3MgKGUuZy4sICJQbGVhc2Ugc2VsZWN0IG5vIjsgX25fPTExKS4gQWNjb3JkaW5nIHRvIHNlbGYgcmVwb3J0LCB0aGUgZmluYWwgYWR1bHQgc2FtcGxlIHJhbmdlZCBpbiBhZ2UgZnJvbSBgciBzdW1tYXJ5KGQyX2FkJGFnZSlbIk1pbi4iXWAtYHIgc3VtbWFyeShkMl9hZCRhZ2UpWyJNYXguIl1gIHllYXJzIChtZWRpYW46IGByIHN1bW1hcnkoZDJfYWQkYWdlKVsiTWVkaWFuIl1geSkgYW5kIGluY2x1ZGVkIHNsaWdodGx5IG1vcmUgbWVuIChgciByb3VuZChkMl9hZF9nZW5kZXIkcHJvcFtkMl9hZF9nZW5kZXIkZ2VuZGVyPT0ibSJdLCAyKSAqIDEwMGAlKSB0aGFuIHdvbWVuIChgciByb3VuZChkMl9hZF9nZW5kZXIkcHJvcFtkMl9hZF9nZW5kZXIkZ2VuZGVyPT0iZiJdLCAyKSAqIDEwMGAlKS4gQWR1bHRzIHByZWRvbWluYW50bHkgaWRlbnRpZmllZCBhcyBXaGl0ZSAoYHIgZDJfYWRfZXRobmljaXR5JHByb3BbZDJfYWRfZXRobmljaXR5JGV0aG5pY2l0eV9jYXQ9PSJ3aGl0ZSJdICogMTAwYCU7IGByIGQyX2FkX2V0aG5pY2l0eSRwcm9wW2QyX2FkX2V0aG5pY2l0eSRldGhuaWNpdHlfY2F0PT0ibXVsdGkiXSAqIDEwMGAlIGlkZW50aWZpZWQgYXMgbW9yZSB0aGFuIG9uZSByYWNlL2V0aG5pY2l0eSwgYW5kICRcbGVxJCBgciBkYXRhLmZyYW1lKGQyX2FkX2V0aG5pY2l0eSAlPiUgZmlsdGVyKCFldGhuaWNpdHlfY2F0ICVpbiUgYygid2hpdGUiLCAibXVsdGkiKSkpJHByb3AgJT4lIG1heCgpICogMTAwYCUgYXMgYW55IG90aGVyIHJhY2UvZXRobmljaXR5KS4KCmBgYHtyfQojIGRlbW9ncmFwaGljcwpkMl83OV9nZW5kZXIgPC0gZGVtb19mdW4oZDJfNzksICJnZW5kZXIiLCAyKQpkMl83OV9ldGhuaWNpdHkgPC0gZGVtb19mdW4oZDJfNzksICJldGhuaWNpdHkiLCAyKQpkMl80Nl9nZW5kZXIgPC0gZGVtb19mdW4oZDJfNDYsICJnZW5kZXIiLCAyKQpkMl80Nl9ldGhuaWNpdHkgPC0gZGVtb19mdW4oZDJfNDYsICJldGhuaWNpdHkiLCAyKQpgYGAKCldlIHJlY3J1aXRlZCB0d28gZ3JvdXBzIG9mIGNoaWxkcmVuOiAib2xkZXIiIGNoaWxkcmVuICg3LTl5KSBhbmQgInlvdW5nZXIiIGNoaWxkcmVuICg0LTZ5KS4gT3VyIHBsYW5uZWQgc2FtcGxlIHNpemUgd2FzIDEyMCBwZXIgYWdlIGdyb3VwLCBidXQgd2UgYWxzbyByZXRhaW5lZCBhIGhhbmRmdWwgb2YgZXh0cmEgcGFydGljaXBhbnRzIHdobyBjb21wbGV0ZWQgdGhlIHN0dWR5IG9uIHRoZSBmaW5hbCBkYXkgb2YgZGF0YSBjb2xsZWN0aW9uIGZvciBlYWNoIGdyb3VwLgoKVGhlIGdyb3VwIHRoYXQgd2Ugd2lsbCByZWZlciB0byBhcyAib2xkZXIgY2hpbGRyZW4iIChfbl89YHIgbnJvdyhkMl83OV93aWRlKWApIHJhbmdlZCBpbiBhZ2UgZnJvbSBgciBzdW1tYXJ5KGQyXzc5JGFnZSlbIk1pbi4iXSAlPiUgcm91bmQoMikgJT4lIGZvcm1hdChuc21hbGwgPSAyKWAtYHIgc3VtbWFyeShkMl83OSRhZ2UpWyJNYXguIl0gJT4lIHJvdW5kKDIpICU+JSBmb3JtYXQobnNtYWxsID0gMilgIHllYXJzIChtZWRpYW46IGByIHN1bW1hcnkoZDJfNzkkYWdlKVsiTWVkaWFuIl0gJT4lIHJvdW5kKDIpICU+JSBmb3JtYXQobnNtYWxsID0gMilgeSksIGFuZCBwYXJ0aWNpcGF0ZWQgYXQgb25lIG9mIHNldmVyYWwgU2FuIEZyYW5jaXNjbyBCYXkgQXJlYSBtdXNldW1zIG9yIGF0IHRoZWlyIHlvdW5nZXIgc2libGluZydzIHByZXNjaG9vbCBiZXR3ZWVuIEp1bHktRGVjZW1iZXIgMjAxNi4gVGhlIHN0dWR5IHRvb2sgbW9zdCBvbGRlciBjaGlsZHJlbiB1bmRlciBgciBxdWFudGlsZShkMl83OSRkdXJhdGlvbiwgLjc1LCBuYS5ybSA9IFQpICU+JSBhcy5udW1lcmljKCkgJT4lIGNlaWxpbmcoKWAgbWludXRlcyB0byBjb21wbGV0ZSAobWVkaWFuIGR1cmF0aW9uOiBgciBzdW1tYXJ5KGQyXzc5JGR1cmF0aW9uKVsiTWVkaWFuIl0gJT4lIHJvdW5kKDIpICU+JSBmb3JtYXQobnNtYWxsID0gMilgIG1pbikuIEFjY29yZGluZyB0byBwYXJlbnRhbCByZXBvcnQsIHRoZSBzYW1wbGUgb2Ygb2xkZXIgY2hpbGRyZW4gaW5jbHVkZWQgc2xpZ2h0bHkgbW9yZSBib3lzIChgciBkMl83OV9nZW5kZXIkcHJvcFtkMl83OV9nZW5kZXIkZ2VuZGVyPT0ibSJdICogMTAwYCUpIHRoYW4gZ2lybHMgKGByIGQyXzc5X2dlbmRlciRwcm9wW2QyXzc5X2dlbmRlciRnZW5kZXI9PSJmIl0gKiAxMDBgJSk7IGByIGQyXzc5X2dlbmRlciRwcm9wW2QyXzc5X2dlbmRlciRnZW5kZXI9PSJNSVNTSU5HIl0gKiAxMDBgJSBvZiBjaGlsZHJlbidzIGdlbmRlciB3YXMgbm9uLWJpbmFyeSBvciB1bmtub3duKS4gUGFyZW50cyBwcmVkb21pbmFudGx5IGlkZW50aWZpZWQgdGhlaXIgY2hpbGRyZW4gYXMgV2hpdGUgKGByIGQyXzc5X2V0aG5pY2l0eSRwcm9wW2QyXzc5X2V0aG5pY2l0eSRldGhuaWNpdHk9PSJ3aGl0ZSJdICogMTAwYCUpLCBTb3V0aCBBc2lhbiAoYHIgZDJfNzlfZXRobmljaXR5JHByb3BbZDJfNzlfZXRobmljaXR5JGV0aG5pY2l0eT09InNvdXRoIG9yIHNvdXRoZWFzdCBhc2lhbiJdICogMTAwYCUpLCBtdWx0aXJhY2lhbCAoYHIgZDJfNzlfZXRobmljaXR5JHByb3BbZDJfNzlfZXRobmljaXR5JGV0aG5pY2l0eT09Im11bHRpIl0gKiAxMDBgJSksIG9yIEVhc3QgQXNpYW4gKGByIGQyXzc5X2V0aG5pY2l0eSRwcm9wW2QyXzc5X2V0aG5pY2l0eSRldGhuaWNpdHk9PSJlYXN0IGFzaWFuIl0gKiAxMDBgJSk7ICRcbGVxJCBgciBkYXRhLmZyYW1lKGQyXzc5X2V0aG5pY2l0eSAlPiUgZmlsdGVyKCFldGhuaWNpdHkgJWluJSBjKCJ3aGl0ZSIsICJtdWx0aSIsICJlYXN0IGFzaWFuIiwgInNvdXRoIG9yIHNvdXRoZWFzdCBhc2lhbiIsICJNSVNTSU5HIikpKSRwcm9wICU+JSBtYXgoKSAqIDEwMGAlIG9mIGNoaWxkcmVuIHdlcmUgaWRlbnRpZmllZCBhcyBhbnkgb3RoZXIgcmFjZS9ldGhuaWNpdHksIGFuZCBgciBkMl83OV9ldGhuaWNpdHkkcHJvcFtkMl83OV9ldGhuaWNpdHkkZXRobmljaXR5PT0iTUlTU0lORyJdICogMTAwYCUgb2YgY2hpbGRyZW4ncyBwYXJlbnRzIGRlY2xpbmVkIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gb24gdGhlaXIgcmFjZS9ldGhuaWNpdHkpLiAKCiJZb3VuZ2VyIGNoaWxkcmVuIiAoX25fPWByIG5yb3coZDJfNDZfd2lkZSlgKSByYW5nZWQgaW4gYWdlIGZyb20gYHIgc3VtbWFyeShkMl80NiRhZ2UpWyJNaW4uIl0gJT4lIHJvdW5kKDIpICU+JSBmb3JtYXQobnNtYWxsID0gMilgLWByIHN1bW1hcnkoZDJfNDYkYWdlKVsiTWF4LiJdICU+JSByb3VuZCgyKSAlPiUgZm9ybWF0KG5zbWFsbCA9IDIpYCB5ZWFycyAobWVkaWFuOiBgciBzdW1tYXJ5KGQyXzQ2JGFnZSlbIk1lZGlhbiJdICU+JSByb3VuZCgyKSAlPiUgZm9ybWF0KG5zbWFsbCA9IDIpYHkpLCBhbmQgcGFydGljaXBhdGVkIGVpdGhlciBhdCBhIHVuaXZlcnNpdHktYWZmaWxpYXRlZCBwcmVzY2hvb2wgb3IgYXQgYSBCYXkgQXJlYSBtdXNldW0gYmV0d2VlbiBKYW51YXJ5LUp1bmUgMjAxNy4gVGhlIHN0dWR5IHRvb2sgbW9zdCB5b3VuZ2VyIGNoaWxkcmVuIHVuZGVyIGByIHF1YW50aWxlKGQyXzQ2JGR1cmF0aW9uLCAuNzUsIG5hLnJtID0gVCkgJT4lIGFzLm51bWVyaWMoKSAlPiUgY2VpbGluZygpYCBtaW51dGVzIHRvIGNvbXBsZXRlIChtZWRpYW4gZHVyYXRpb246IGByIHN1bW1hcnkoZDJfNDYkZHVyYXRpb24pWyJNZWRpYW4iXSAlPiUgcm91bmQoMikgJT4lIGZvcm1hdChuc21hbGwgPSAyKWAgbWluKS4gQWNjb3JkaW5nIHRvIHBhcmVudGFsIHJlcG9ydCBhbmQgc2Nob29sIHJlY29yZHMsIHRoZSBzYW1wbGUgb2YgeW91bmdlciBjaGlsZHJlbiBpbmNsdWRlZCByb3VnaGx5IHRoZSBzYW1lIG51bWJlciBvZiBnaXJscyAoYHIgZDJfNDZfZ2VuZGVyJHByb3BbZDJfNDZfZ2VuZGVyJGdlbmRlcj09Im0iXSAqIDEwMGAlKSBhbmQgYm95cyAoYHIgZDJfNDZfZ2VuZGVyJHByb3BbZDJfNDZfZ2VuZGVyJGdlbmRlcj09ImYiXSAqIDEwMGAlKS4gQ2hpbGRyZW4gd2VyZSBwcmVkb21pbmFudGx5IGlkZW50aWZpZWQgYXMgbXVsdGlyYWNpYWwgKGByIGQyXzQ2X2V0aG5pY2l0eSRwcm9wW2QyXzQ2X2V0aG5pY2l0eSRldGhuaWNpdHk9PSJtdWx0aSJdICogMTAwYCUpIG9yIFdoaXRlIChgciBkMl80Nl9ldGhuaWNpdHkkcHJvcFtkMl80Nl9ldGhuaWNpdHkkZXRobmljaXR5PT0id2hpdGUiXSAqIDEwMGAlOyAkXGxlcSQgYHIgZGF0YS5mcmFtZShkMl80Nl9ldGhuaWNpdHkgJT4lIGZpbHRlcighZXRobmljaXR5ICVpbiUgYygid2hpdGUiLCAibXVsdGkiLCAiTUlTU0lORyIpKSkkcHJvcCAlPiUgbWF4KCkgKiAxMDBgJSBvZiBjaGlsZHJlbiB3ZXJlIGlkZW50aWZpZWQgYXMgYW55IG90aGVyIHJhY2UvZXRobmljaXR5LCBhbmQgYHIgZDJfNDZfZXRobmljaXR5JHByb3BbZDJfNDZfZXRobmljaXR5JGV0aG5pY2l0eT09Ik1JU1NJTkciXSAqIDEwMGAlIG9mIGNoaWxkcmVuJ3MgcGFyZW50cyBkZWNsaW5lZCB0byBwcm92aWRlIGluZm9ybWF0aW9uIG9uIHRoZWlyIHJhY2UvZXRobmljaXR5KS4KCkFuIGFkZGl0aW9uYWwgNyBjaGlsZHJlbiBwYXJ0aWNpcGF0ZWQgYnV0IHdlcmUgZXhjbHVkZWQgZm9yIGJlaW5nIG91dHNpZGUgdGhlIHRhcmdldCBhZ2UgcmFuZ2VzLiBBdCBtdXNldW1zIChidXQgbm90IGF0IHRoZSBwcmVzY2hvb2wpLCBjaGlsZHJlbiByZWNlaXZlZCBhIHNtYWxsIHRoYW5rLXlvdSBnaWZ0IChlLmcuLCBhIHN0aWNrZXIpIGZvciB0aGVpciBwYXJ0aWNpcGF0aW9uLiAKCiMjIyBNYXRlcmlhbHMgYW5kIHByb2NlZHVyZQoKUGlsb3QgdGVzdGluZyBzdWdnZXN0ZWQgdGhhdCB3b3JraW5nIHdpdGggeW91bmdlciBjaGlsZHJlbiB3b3VsZCByZXF1aXJlIG1ha2luZyBhIGJyaWVmZXIgZXhwZXJpbWVudGFsIHBhcmFkaWdtIHdpdGggZmV3ZXIgdGhhbiB0aGUgNDAgcXVlc3Rpb25zIGluY2x1ZGVkIGluIFN0dWR5IDE7IGxpbWl0aW5nIHRoZSBsaXN0IHRvIDIwIHF1ZXN0aW9ucyBzZWVtZWQgdG8gYWxsb3cgY2hpbGRyZW4gYXMgeW91bmcgYXMgNCB5ZWFycyBvZiBhZ2UgdG8gY29tcGxldGUgdGhlIHN0dWR5IGVhc2lseSBhbmQgd2l0aG91dCBnZXR0aW5nIGJvcmVkIG9yIGZydXN0cmF0ZWQsIHdoaWxlIHN0aWxsIGluY2x1ZGluZyBlbm91Z2ggaXRlbXMgdG8gZW5hYmxlIHVzIHRvIHByb2NlZWQgd2l0aCBvdXIgZXhwbG9yYXRvcnkgImRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbiIgYXBwcm9hY2ggdG8gdW5jb3ZlcmluZyBjb25jZXB0dWFsIHN0cnVjdHVyZS4KCmBgYHtyfQpkMl9hZF9jaGFyIDwtIGRlbW9fZnVuKGQyX2FkLCAiY2hhcmFjdGVyIikKZDJfNzlfY2hhciA8LSBkZW1vX2Z1bihkMl83OSwgImNoYXJhY3RlciIpCmQyXzQ2X2NoYXIgPC0gZGVtb19mdW4oZDJfNDYsICJjaGFyYWN0ZXIiKQpkMl9hbGxfY2hhciA8LSBkMl9hZF9jaGFyICU+JSBtdXRhdGUoYWdlX2dyb3VwID0gImFkdWx0cyIpICU+JQogIGZ1bGxfam9pbihkMl83OV9jaGFyICU+JSBtdXRhdGUoYWdlX2dyb3VwID0gImNoaWxkcmVuNzkiKSkgJT4lCiAgZnVsbF9qb2luKGQyXzQ2X2NoYXIgJT4lIG11dGF0ZShhZ2VfZ3JvdXAgPSAiY2hpbGRyZW40NiIpKQpgYGAKClBhcnRpY2lwYW50cyB3ZXJlIGFzc2lnbmVkIHRvIGV2YWx1YXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHRhcmdldCBjaGFyYWN0ZXJzOiBhbiBlbGVwaGFudCwgYSBnb2F0LCBhIG1vdXNlLCBhIGJpcmQsIGEgYmVldGxlLCBhIHRlZGR5IGJlYXIsIGEgZG9sbCwgYSByb2JvdCwgb3IgYSBjb21wdXRlciAoX25fIHBlciBjaGFyYWNhdGVyOiBgciBtaW4oZDJfYWRfY2hhciRuKWAtYHIgbWF4KGQyX2FkX2NoYXIkbilgIGFkdWx0cywgYHIgbWluKGQyXzc5X2NoYXIkbilgLWByIG1heChkMl83OV9jaGFyJG4pYCBvbGRlciBjaGlsZHJlbiwgYW5kIGByIG1pbihkMl80Nl9jaGFyJG4pYC1gciBtYXgoZDJfNDZfY2hhciRuKWAgeW91bmdlciBjaGlsZHJlbjsgc2VlIEZpZ3VyZSA2IGZvciBleGFjdCBjb3VudHMpLgoKUGFydGljaXBhbnRzIHdlcmUgYXNzaWduZWQgdG8gdGFyZ2V0IGNoYXJhY3RlcnMgcmFuZG9tbHksIHdpdGggdHdvIGV4Y2VwdGlvbnM6ICgxKSBUaGUgZG9sbCBhbmQgdGVkZHkgYmVhciBjb25kaXRpb25zIHdlcmUgcnVuIGxhc3QgZm9yIG9sZGVyIGNoaWxkcmVuIChidXQgaW5jbHVkZWQgaW4gdGhlIGluaXRpYWwgcmFuZG9taXphdGlvbiBzY2hlbWUgZm9yIGFkdWx0cyBhbmQgeW91bmdlciBjaGlsZHJlbik7IGFuZCAoMikgVG93YXJkIHRoZSBlbmQgb2YgZGF0YSBjb2xsZWN0aW9uIHdpdGggY2hpbGRyZW4sIGNoaWxkcmVuIHdlcmUgYXNzaWduZWQgdG8gY29uZGl0aW9ucyB0aGF0IGhhZCB0aGUgZmV3ZXN0IHBhcnRpY2lwYW50cy4gKFRoaXMgd2FzIG5vdCBwb3NzaWJsZSB3aXRoIGFkdWx0cywgd2hpY2ggaXMgd2h5IHRoZSBudW1iZXIgb2YgYWR1bHRzIHBlciBjb25kaXRpb24gd2FzIG1vcmUgdmFyaWFibGUgdGhhbiB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIHBlciBjb25kaXRpb24uKSBBcyBpbiBTdHVkeSAxLCBhIHZpdmlkLCBoaWdoLXJlc29sdXRpb24gcGhvdG8gb2YgdGhlIHRhcmdldCBjaGFyYWN0ZXIgaW4gYSBuYXR1cmFsaXN0aWMgY29udGV4dCB3YXMgdmlzaWJsZSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBzdHVkeS4gCgpJbnN0cnVjdGlvbnMgYW5kIHByb2NlZHVyZSB3ZXJlIGlkZW50aWNhbCB0byBTdHVkeSAxLCB3aXRoIHR3byBleGNlcHRpb25zOiAoMSkgUGFydGljaXBhbnRzIHJhdGVkIHRoZSB0YXJnZXQgY2hhcmFjdGVyIG9uIDIwIChyYXRoZXIgdGhhbiA0MCkgbWVudGFsIGNhcGFjaXRpZXM7IGFuZCAoMikgRm9yIHlvdW5nZXIgY2hpbGRyZW4sIHRoZSBleHBlcmltZW50ZXIgcmVhZCBhbGwgcXVlc3Rpb25zIG91dCBsb3VkIGFuZCBjaGlsZHJlbiByZXNwb25kZWQgdmVyYmFsbHkuIAoKVGhlIDIwIG1lbnRhbCBjYXBhY2l0aWVzIHdlcmUgYSBzdWJzZXQgb2YgdGhlIDQwIGl0ZW1zIHVzZWQgaW4gU3R1ZHkgMSwgY2hvc2VuIHRvIGluY2x1ZGUgcGh5c2lvbG9naWNhbCBzZW5zYXRpb25zLCBlbW90aW9uYWwgZXhwZXJpZW5jZXMsIHBlcmNlcHR1YWwgYWJpbGl0aWVzLCBjb2duaXRpdmUgc2tpbGxzLCBjYXBhY2l0aWVzIHJlbGF0ZWQgdG8gYXV0b25vbXkgb3IgYWdlbmN5LCBhbmQgc29jaWFsIGFiaWxpdGllczsgYW5kIHRvIGluY2x1ZGUgc29tZSBvZiB0aGUgc3Ryb25nZXN0LWxvYWRpbmcgaXRlbXMgZm9yIGVhY2ggb2YgdGhlIHRocmVlIGZhY3RvcnMgdW5jb3ZlcmVkIGFtb25nIGFkdWx0cyBpbiBTdHVkeSAxIChzZWUgRmlndXJlIDEpLiBBcyBpbiBTdHVkeSAxLCBlYWNoIG1lbnRhbCBjYXBhY2l0eSB3YXMgYXNzb2NpYXRlZCB3aXRoIGEgc2hvcnQsIHByZXNldCBkZWZpbml0aW9uLiBCb3RoIG9sZGVyIGFuZCB5b3VuZ2VyIGNoaWxkcmVuIHdlcmUgZW5jb3VyYWdlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHVkeSB0byBhc2sgcXVlc3Rpb25zIGlmIHRoZXkgZGlkIG5vdCBrbm93IHdoYXQgYSB3b3JkIG1lYW50LCBpbiB3aGljaCBjYXNlIHRoZXkgd2VyZSBnaXZlbiB0aGVzZSBkZWZpbml0aW9ucy4gKEFkdWx0cyBkaWQgbm90IGhhdmUgYWNjZXNzIHRvIHRoZXNlIGRlZmluaXRpb25zLikKCkFmdGVyIGNvbXBsZXRpbmcgdGhlIDIwIHF1ZXN0aW9ucyBhYm91dCBtZW50YWwgY2FwYWNpdGllcywgZm9yIGEgc3Vic2V0IG9mIHBhcnRpY2lwYW50cyB3ZSBhbHNvIGFza2VkIHR3byBhZGRpdGlvbmFsIHF1ZXN0aW9uczogIklzIGEgW3RhcmdldF0gbWFkZSBvdXQgb2YgbWV0YWw/IiBhbmQgIkNhbiBhIFt0YXJnZXRdIGJlIHR1cm5lZCBvbiBhbmQgb2ZmPyIgVGhlc2UgcXVlc3Rpb25zIHdlcmUgYWx3YXlzIGFza2VkIGxhc3QsIGFuZCB3ZXJlIG5vdCBpbnRlbmRlZCB0byBiZSBpbmNsdWRlZCBpbiBhbnkgb2Ygb3VyIHByaW1hcnkgYW5hbHlzZXMuIFNlZSBTT00gZm9yIGFuIGFuYWx5c2lzIG9mIHJlc3BvbnNlcyB0byB0aGVzZSBxdWVzdGlvbnMuCgojIyMgRGF0YSBwcm9jZXNzaW5nCgpXZSBwbGFubmVkIHRvIGRyb3AgdHJpYWxzIHdpdGggcmVzcG9uc2UgdGltZXMgdGhhdCB3ZXJlIGZhc3RlciB0aGFuIGEgcHJlc2V0IGNyaXRlcmlvbiBvZiAyNTBtcywgYnV0IHRoZXJlIHdlcmUgbm9uZSBhbW9uZyBjaGlsZHJlbiwgYW5kIHdlIGZhaWxlZCB0byByZWNvcmQgcmVzcG9uc2UgdGltZXMgYW1vbmcgYWR1bHRzLiBBcyBpbiBTdHVkeSAxLCB3ZSByZXRhaW5lZCBwYXJ0aWNpcGFudHMgcmVnYXJkbGVzcyBvZiBza2lwcGVkIHRyaWFscy4gT3ZlcmFsbCwgbm9uZSBvZiBhZHVsdHMgb3Igb2xkZXIgY2hpbGRyZW4ncyB0cmlhbHMsIGFuZCBvbmx5IGByIHJvdW5kKHN1bShpcy5uYShkMl80Nl93aWRlKSkvc3VtKCFpcy5uYShkMl80Nl93aWRlKSkqMTAwLCAyKWAlIG9mIHlvdW5nZXIgY2hpbGRyZW4ncyB0cmlhbHMgKF9uXz1gciBzdW0oaXMubmEoZDJfNDZfd2lkZSkpYCkgd2VyZSBtaXNzaW5nIGRhdGEuCgpGb3Igb3VyIGV4cGxvcmF0b3J5IGZhY3RvciBhbmFseXNlcywgd2UgbG9va2VkIGF0IGVhY2ggZ3JvdXAgb2YgcGFydGlwYW50cyAoYWR1bHRzLCBvbGRlciBjaGlsZHJlbiwgYW5kIHlvdW5nZXIgY2hpbGRyZW4pIHNlcGFyYXRlbHksIGJlY2F1c2UgRUZBIGlzIGEgZ3JvdXAtbGV2ZWwgYW5hbHlzaXMgb2YgdGhlIGNvbnNlbnN1YWwgY29uY2VwdHVhbCBzdHJ1Y3R1cmUgYW5kIGlzIG5vdCBkZXNpZ25lZCB0byBtb2RlbCBjb250aW51b3VzIHBhcnRpY2lwYW50LWxldmVsIHZhcmlhYmxlcyBsaWtlIGV4YWN0IGFnZS4gT3VyIGdvYWwgd2l0aCB0aGVzZSBhbmFseXNlcyB3YXMgdG8gZXhhbWluZSBkaXNjcmV0ZSDigJxzbmFwc2hvdHPigJ0gb2YgdGhpcyBjb25jZXB0dWFsIHN0cnVjdHVyZSBhdCB0d28gcG9pbnRzIGluIHRoaXMgY29udGludW91cyBkZXZlbG9wbWVudGFsIHRyYWplY3RvcnkuCgojIyBSZXN1bHRzCgojIyMgQ29uY2VwdHVhbCBzdHJ1Y3R1cmU6IEFkdWx0cwoKYGBge3J9CiMgaW1wbGVtZW50IDMgZmFjdG9yIHJldGVudGlvbiBwcm90b2NvbHMKbmZhY3RfcGFyX2QyX2FkIDwtIGZhLnBhcmFsbGVsKGQyX2FkX3dpZGVfaSwgY29yID0gY2hvc2VuX2NvciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbSA9IGNob3Nlbl9mbSwgcGxvdCA9IEYpJG5mYWN0Cm5mYWN0X2JpY19kMl9hZCA8LSB2c3MoZDJfYWRfd2lkZV9pLCBjb3IgPSBjaG9zZW5fY29yLCByb3RhdGUgPSBjaG9zZW5fcm90LCAKICAgICAgICAgICAgICAgICAgICAgICBmbSA9IGNob3Nlbl9mbSwgcGxvdCA9IEYpJHZzcy5zdGF0cyRCSUMgJT4lIHdoaWNoLm1pbigpCm5mYWN0X3dkbV9kMl9hZCA8LSByZXRlbl9mdW4oZDJfYWRfd2lkZV9pLCByb3RfdHlwZSA9IGNob3Nlbl9yb3QpCgpjYXQoIlBhcmFsbGVsIGFuYWx5c2lzOiAiLCBuZmFjdF9wYXJfZDJfYWQsCiAgICAiXG5NaW5pbWl6aW5nIEJJQzogIiwgbmZhY3RfYmljX2QyX2FkLAogICAgIlxuV2Vpc21hbiBldCBhbC46ICIsIG5mYWN0X3dkbV9kMl9hZCkKYGBgCgpgYGB7cn0KZWZhXzRfZDJfYWQgPC0gZmFfZnVuKGQyX2FkX3dpZGVfaSwgNCkKYGBgCgpBcyBpbiBTdHVkeSAxLCB0d28gb3Igb3VyIHRocmVlIG1ldGhvZHMgZm9yIGRldGVybWluaW5nIGhvdyBtYW55IGZhY3RvcnMgdG8gcmV0YWluIChpbiB0aGlzIGNhc2UsIHBhcmFsbGVsIGFuYWx5c2lzIGFuZCBXZWlzbWFuIGV0IGFsLidzIGZhY3RvciByZXRlbnRpb24gY3JpdGVyaWEpIHN1Z2dlc3RlZCByZXRhaW5pbmcgdGhyZWUgZmFjdG9ycy4gKE1pbmltaXppbmcgQklDIHN1Z2dlc3RlZCByZXRhaW5pbmcgZm91ciBmYWN0b3JzLCBidXQgdGhlIGZvdXJ0aCBmYWN0b3Igd2FzIHRoZSBkb21pbmFudCBmYWN0b3IgZm9yIG9ubHkgYHIgdG9wX25fZG9tQ2FwKGVmYV80X2QyX2FkLCAyMCwgIkY0IiwgInBvcyIpICU+JSBsZW5ndGgoKWAgbWVudGFsIGNhcGFjaXR5OiBgciB0b3Bfbl9kb21DYXAoZWZhXzRfZDJfYWQsIDIwLCAiRjQiLCAicG9zIilgOyBzZWUgU09NLikKCmBgYHtyfQplZmFfM19kMl9hZCA8LSBmYV9mdW4oZDJfYWRfd2lkZV9pLCAzKQplZmFfM19wbG90X2QyX2FkIDwtIGhlYXRtYXBfZnVuKGVmYV8zX2QyX2FkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBjKCJCT0RZIiwgIkhFQVJUIiwgIk1JTkQiKSkgKwogIGxhYnModGl0bGUgPSBwYXN0ZTAoIkFkdWx0cyAobj0iLCBucm93KGQyX2FkX3dpZGVfaSksICIpIikpICsKICBndWlkZXMoZmlsbCA9ICJub25lIikKYGBgCgpBcyBleHBlY3RlZCwgdGhlIGNvbmNlcHR1YWwgc3RydWN0dXJlIHJldmVhbGVkIGJ5IHRoaXMgYW5hbHlzaXMgYW1vbmcgYWR1bHRzIHdhcyBjaGFyYWN0ZXJpemVkIGJ5IGEgdGhyZWUtd2F5IGRpc3RpbmN0aW9uIGJldHdlZW4gX0JPRFlfIChmaXJzdCBmYWN0b3IsIGByIHJvdW5kKGVmYV8zX2QyX2FkJFZhY2NvdW50ZWRbIlByb3BvcnRpb24gRXhwbGFpbmVkIiwgIkYxIl0sIDIpICogMTAwYCUgb2YgdGhlIHNoYXJlZCB2YXJpYW5jZSBpbiB0aGUgcm90YXRlZCB0aHJlZS1mYWN0b3Igc29sdXRpb24pLCBfSEVBUlRfIChzZWNvbmQgZmFjdG9yLCBgciByb3VuZChlZmFfM19kMl9hZCRWYWNjb3VudGVkWyJQcm9wb3J0aW9uIEV4cGxhaW5lZCIsICJGMiJdLCAyKSAqIDEwMGAlIG9mIHNoYXJlZCB2YXJpYW5jZSksIGFuZCBfTUlORF8gKHRoaXJkIGZhY3RvciwgYHIgcm91bmQoZWZhXzNfZDJfYWQkVmFjY291bnRlZFsiUHJvcG9ydGlvbiBFeHBsYWluZWQiLCAiRjMiXSwgMikgKiAxMDBgJSBvZiBzaGFyZWQgdmFyaWFuY2UpLiBTZWUgRmlndXJlIDUsIFBhbmVsIEQuCgpUaGlzIHN1Z2dlc3RzIHRoYXQgb3VyIG1vZGlmaWVkIGNoaWxkLWZyaWVuZGx5IHBhcmFkaWdtIHdhcyB2YWxpZDogVXNpbmcgYSBzaG9ydGVyIGxpc3Qgb2YgaXRlbXMgYW5kIGEgd2lkZXIgcmFuZ2Ugb2YgdGFyZ2V0IGNoYXJhY3RlcnMgZWxpY2l0ZWQgdGhlIHNhbWUgaW50dWl0aXZlIG9udG9sb2d5IG9mIG1lbnRhbCBsaWZlLCBhbW9uZyBVUyBhZHVsdHMsIHRoYXQgd2FzIHJldmVhbGVkIGluIFN0dWR5IDEgYW5kIGluIFdlaXNtYW4gZXQgYWwuJ3MgKDIwMTcpIHByZXZpb3VzIHdvcmsuIAoKIyMjIENvbmNlcHR1YWwgc3RydWN0dXJlOiBPbGRlciBjaGlsZHJlbiAoNy05eSkKCmBgYHtyfQojIGltcGxlbWVudCAzIGZhY3RvciByZXRlbnRpb24gcHJvdG9jb2xzCm5mYWN0X3Bhcl9kMl83OSA8LSBmYS5wYXJhbGxlbChkMl83OV93aWRlX2ksIGNvciA9IGNob3Nlbl9jb3IsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm0gPSBjaG9zZW5fZm0sIHBsb3QgPSBGKSRuZmFjdApuZmFjdF9iaWNfZDJfNzkgPC0gdnNzKGQyXzc5X3dpZGVfaSwgY29yID0gY2hvc2VuX2Nvciwgcm90YXRlID0gY2hvc2VuX3JvdCwgCiAgICAgICAgICAgICAgICAgICAgICAgZm0gPSBjaG9zZW5fZm0sIHBsb3QgPSBGKSR2c3Muc3RhdHMkQklDICU+JSB3aGljaC5taW4oKQpuZmFjdF93ZG1fZDJfNzkgPC0gcmV0ZW5fZnVuKGQyXzc5X3dpZGVfaSwgcm90X3R5cGUgPSBjaG9zZW5fcm90KQoKY2F0KCJQYXJhbGxlbCBhbmFseXNpczogIiwgbmZhY3RfcGFyX2QyXzc5LAogICAgIlxuTWluaW1pemluZyBCSUM6ICIsIG5mYWN0X2JpY19kMl83OSwKICAgICJcbldlaXNtYW4gZXQgYWwuOiAiLCBuZmFjdF93ZG1fZDJfNzkpCmBgYAoKYGBge3J9CmVmYV8zX2QyXzc5IDwtIGZhX2Z1bihkMl83OV93aWRlX2ksIDMpCgplZmFfM19wbG90X2QyXzc5IDwtIGhlYXRtYXBfZnVuKGVmYV8zX2QyXzc5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBjKCJCT0RZIiwgIkhFQVJUIiwgIk1JTkQiKSkgKwogIGxhYnModGl0bGUgPSBwYXN0ZTAoIk9sZGVyIGNoaWxkcmVuICg3LTl5LCBuPSIsIG5yb3coZDJfNzlfd2lkZV9pKSwgIikiKSkgKwogIGd1aWRlcyhmaWxsID0gIm5vbmUiKQpgYGAKCmBgYHtyfQpjb25nX2VmYV8zX2QyX2FkXzc5IDwtIGZhLmNvbmdydWVuY2UoZWZhXzNfZDJfNzkkbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfM19kMl9hZCRsb2FkaW5ncykKYGBgCgpPdXIgdGhyZWUgbWV0aG9kcyBmb3IgZGV0ZXJtaW5pbmcgaG93IG1hbnkgZmFjdG9ycyB0byByZXRhaW4gYWxsIHN1Z2dlc3RlZCByZXRhaW5pbmcgdGhyZWUgZmFjdG9ycy4gQXMgaW4gU3R1ZHkgMSwgdGhlIGNvbmNlcHR1YWwgc3RydWN0dXJlIHJldmVhbGVkIGJ5IHRoaXMgYW5hbHlzaXMgYW1vbmcgNy0gdG8gOS15ZWFyLW9sZCBjaGlsZHJlbiB3YXMgdmVyeSBzaW1pbGFyIHRvIHRoYXQgb2YgYWR1bHRzLCBhZ2FpbiBjaGFyYWN0ZXJpemVkIGJ5IGEgdGhyZWUtd2F5IGRpc3RpbmN0aW9uIGJldHdlZW4gX0JPRFlfLCBfSEVBUlRfLCBhbmQgX01JTkRfLgoKQWZ0ZXIgcm90YXRpb24sIHRoZSBmaXJzdCBmYWN0b3IgY29ycmVzcG9uZGVkIHByaW1hcmlseSB0byBwaHlzaW9sb2dpY2FsIHNlbnNhdGlvbnMuIEFuIGFuYWx5c2lzIG9mIGZhY3RvciBjb25ncnVlbmNlIGNvbmZpcm1lZCB0aGF0IHRoaXMgZmFjdG9yIHdhcyBtb3N0IHNpbWlsYXIgdG8gYWR1bHRzJyBfQk9EWV8gZmFjdG9yIChjb3NpbmUgc2ltaWxhcml0eSB3aXRoIF9CT0RZXzogYHIgY29uZ19lZmFfM19kMl9hZF83OVsiRjEiLCAiRjEiXWA7IHdpdGggX0hFQVJUXzogYHIgY29uZ19lZmFfM19kMl9hZF83OVsiRjEiLCAiRjIiXWA7IHdpdGggX01JTkRfOiBgciBjb25nX2VmYV8zX2QyX2FkXzc5WyJGMSIsICJGMyJdYCkuIEl0IHdhcyB0aGUgZG9taW5hbnQgZmFjdG9yIGZvciBzdWNoIGl0ZW1zIGFzIGByIHRvcF9uX2RvbUNhcChlZmFfM19kMl83OSwgNCwgIkYxIiwgInBvcyIpYCwgYW5kIGFjY291bnRlZCBmb3IgYHIgcm91bmQoZWZhXzNfZDJfNzkkVmFjY291bnRlZFsiUHJvcG9ydGlvbiBFeHBsYWluZWQiLCAiRjEiXSwgMikgKiAxMDBgJSBvZiB0aGUgc2hhcmVkIHZhcmlhbmNlIGluIHRoZSByb3RhdGVkIHRocmVlLWZhY3RvciBzb2x1dGlvbi4gCgpUaGUgc2Vjb25kIGZhY3RvciBjb3JyZXNwb25kZWQgcHJpbWFyaWx5IHRvIHNvY2lhbC1lbW90aW9uYWwgYWJpbGl0aWVzLiBBbiBhbmFseXNpcyBvZiBmYWN0b3IgY29uZ3J1ZW5jZSBjb25maXJtZWQgdGhhdCB0aGlzIGZhY3RvciB3YXMgbW9zdCBzaW1pbGFyIHRvIGFkdWx0cycgX0hFQVJUXyBmYWN0b3IgKGNvc2luZSBzaW1pbGFyaXR5IHdpdGggX0hFQVJUXzogYHIgY29uZ19lZmFfM19kMl9hZF83OVsiRjIiLCAiRjIiXWA7IHdpdGggX0JPRFlfOiBgciBjb25nX2VmYV8zX2QyX2FkXzc5WyJGMiIsICJGMSJdYDsgd2l0aCBfTUlORF86IGByIGNvbmdfZWZhXzNfZDJfYWRfNzlbIkYyIiwgIkYzIl1gKS4gSXQgd2FzIHRoZSBkb21pbmFudCBmYWN0b3IgZm9yIHN1Y2ggaXRlbXMgYXMgYHIgdG9wX25fZG9tQ2FwKGVmYV8zX2QyXzc5LCA0LCAiRjIiLCAicG9zIilgLCBhbmQgYWNjb3VudGVkIGZvciBgciByb3VuZChlZmFfM19kMl83OSRWYWNjb3VudGVkWyJQcm9wb3J0aW9uIEV4cGxhaW5lZCIsICJGMiJdLCAyKSAqIDEwMGAlIG9mIHRoZSBzaGFyZWQgdmFyaWFuY2UgaW4gdGhlIHJvdGF0ZWQgdGhyZWUtZmFjdG9yIHNvbHV0aW9uLiAKClRoZSB0aGlyZCBmYWN0b3IgY29ycmVzcG9uZGVkIHByaW1hcmlseSB0byBwZXJjZXB0dWFsLWNvZ25pdGl2ZSBhYmlsaXRpZXMuIEFuIGFuYWx5c2lzIG9mIGZhY3RvciBjb25ncnVlbmNlIGNvbmZpcm1lZCB0aGF0IHRoaXMgZmFjdG9yIHdhcyBtb3N0IHNpbWlsYXIgdG8gYWR1bHRzJyBfTUlORF8gZmFjdG9yIChjb3NpbmUgc2ltaWxhcml0eSB3aXRoIF9NSU5EXzogYHIgY29uZ19lZmFfM19kMl9hZF83OVsiRjMiLCAiRjMiXWA7IHdpdGggX0hFQVJUXzogYHIgY29uZ19lZmFfM19kMl9hZF83OVsiRjMiLCAiRjIiXWA7IHdpdGggX0JPRFlfOiBgciBjb25nX2VmYV8zX2QyX2FkXzc5WyJGMyIsICJGMSJdYCkuIEl0IHdhcyB0aGUgZG9taW5hbnQgZmFjdG9yIGZvciBzdWNoIGl0ZW1zIGFzIGByIHRvcF9uX2RvbUNhcChlZmFfM19kMl83OSwgNCwgIkYzIiwgInBvcyIpYCwgYW5kIGFjY291bnRlZCBmb3IgYHIgcm91bmQoZWZhXzNfZDJfNzkkVmFjY291bnRlZFsiUHJvcG9ydGlvbiBFeHBsYWluZWQiLCAiRjMiXSwgMikgKiAxMDBgJSBvZiB0aGUgc2hhcmVkIHZhcmlhbmNlIGluIHRoZSByb3RhdGVkIHRocmVlLWZhY3RvciBzb2x1dGlvbi4gKFNlZSBGaWd1cmUgNSwgUGFuZWwgQywgZm9yIGFsbCBmYWN0b3IgbG9hZGluZ3MuKQoKV2UgY29uc2lkZXIgdGhpcyB0byBiZSBhIGNsb3NlIGNvbmNlcHR1YWwgcmVwbGljYXRpb24gb2Ygb3VyIFN0dWR5IDEgZmluZGluZ3MsIHN1Z2dlc3RpbmcgdGhhdCBieSB0aGUgYWdlIG9mIDctOSB5ZWFycywgdGhpcyB0aHJlZS1wYXJ0IGNvbmNlcHR1YWwgc3RydWN0dXJlIGlzIHN0YWJsZSBhbmQgcm9idXN0IHRvIGEgcmFuZ2Ugb2YgZXhwZXJpbWVudGFsIGNvbmRpdGlvbnMuCgojIyMgQ29uY2VwdHVhbCBzdHJ1Y3R1cmU6IFlvdW5nZXIgY2hpbGRyZW4gKDQtNnkpCgpgYGB7cn0KIyBpbXBsZW1lbnQgMyBmYWN0b3IgcmV0ZW50aW9uIHByb3RvY29scwpuZmFjdF9wYXJfZDJfNDYgPC0gZmEucGFyYWxsZWwoZDJfNDZfd2lkZV9pLCBjb3IgPSBjaG9zZW5fY29yLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtID0gY2hvc2VuX2ZtLCBwbG90ID0gRikkbmZhY3QKbmZhY3RfYmljX2QyXzQ2IDwtIHZzcyhkMl80Nl93aWRlX2ksIGNvciA9IGNob3Nlbl9jb3IsIHJvdGF0ZSA9IGNob3Nlbl9yb3QsIAogICAgICAgICAgICAgICAgICAgICAgIGZtID0gY2hvc2VuX2ZtLCBwbG90ID0gRikkdnNzLnN0YXRzJEJJQyAlPiUgd2hpY2gubWluKCkKbmZhY3Rfd2RtX2QyXzQ2IDwtIHJldGVuX2Z1bihkMl80Nl93aWRlX2ksIHJvdF90eXBlID0gY2hvc2VuX3JvdCkKCmNhdCgiUGFyYWxsZWwgYW5hbHlzaXM6ICIsIG5mYWN0X3Bhcl9kMl80NiwKICAgICJcbk1pbmltaXppbmcgQklDOiAiLCBuZmFjdF9iaWNfZDJfNDYsCiAgICAiXG5XZWlzbWFuIGV0IGFsLjogIiwgbmZhY3Rfd2RtX2QyXzQ2KQpgYGAKCmBgYHtyfQplZmFfMV9kMl80NiA8LSBmYV9mdW4oZDJfNDZfd2lkZV9pLCAxKQpgYGAKCk91ciB0aHJlZSBtZXRob2RzIGZvciBkZXRlcm1pbmluZyBob3cgbWFueSBmYWN0b3JzIHRvIHJldGFpbiBlYWNoIHN1Z2dlc3RlZCByZXRhaW5pbmcgZGlmZmVyZW50IG51bWJlcnMgb2YgZmFjdG9yczogV2Vpc21hbiBldCBhbC4ncyBmYWN0b3IgcmV0ZW50aW9uIGNyaXRlcmlhIHN1Z2dlc3RlZCByZXRhaW5pbmcgYHIgbmZhY3Rfd2RtX2QyXzQ2YCBmYWN0b3JzLCBwYXJhbGxlbCBhbmFseXNpcyBzdWdnZXN0ZWQgcmV0YWluaW5nIGByIG5mYWN0X3Bhcl9kMl80NmAgZmFjdG9ycywgYW5kIG1pbmltaXppbmcgQklDIHN1Z2dlc3RlZCBhIG51bGwsIGByIG5mYWN0X2JpY19kMl80NmAtZmFjdG9yIHNvbHV0aW9uLiBIZXJlIHdlIHByZXNlbnQgYm90aCB0aGUgdHdvLSBhbmQgdGhyZWUtZmFjdG9yIHNvbHV0aW9ucy4gKFNlZSBTT00gZm9yIGZhY3RvciBsb2FkaW5ncyBvbiB0aGUgb25lICJmYWN0b3IiIGluIHRoZSBudWxsLCBvbmUtZmFjdG9yIHNvbHV0aW9uLCB3aGljaCB5aWVsZGVkIHBhcnRpY3VsYXJseSBzdHJvbmcgbG9hZGluZ3MgZm9yIHNvY2lhbC1lbW90aW9uYWwgZXhwZXJpZW5jZXMgYW5kIHBoeXNpb2xvZ2ljYWwgc2Vuc2F0aW9ucywgc3VjaCBhcyBgciB0b3Bfbl9kb21DYXAoZWZhXzFfZDJfNDYsIDQsICJGMSIpYC4pCgojIyMjIFRocmVlLWZhY3RvciBzb2x1dGlvbgoKYGBge3J9CmVmYV8zX2QyXzQ2IDwtIGZhX2Z1bihkMl80Nl93aWRlX2ksIDMpCgplZmFfM19wbG90X2QyXzQ2IDwtIGhlYXRtYXBfZnVuKGVmYV8zX2QyXzQ2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGMoIkJPRFkqIiwgIk1JTkQiLCAiSEVBUlQqIikpICsKICBsYWJzKHRpdGxlID0gcGFzdGUwKCJZb3VuZ2VyIGNoaWxkcmVuICg0LTZ5LCBuPSIsIG5yb3coZDJfNDZfd2lkZV9pKSwgIik6IDMtZmFjdG9yIHNvbHV0aW9uIikpICsKICBndWlkZXMoZmlsbCA9ICJub25lIikKYGBgCgpgYGB7cn0KY29uZ19lZmFfM19kMl9hZF80NiA8LSBmYS5jb25ncnVlbmNlKGVmYV8zX2QyXzQ2JGxvYWRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhXzNfZDJfYWQkbG9hZGluZ3MpCmBgYAoKSW4gdGhlIHJvdGF0ZWQgdGhyZWUtZmFjdG9yIHNvbHV0aW9uIHN1Z2dlc3RlZCBieSBXZWlzbWFuIGV0IGFsLidzIHJldGVudGlvbiBjcml0ZXJpYSwgdGhlIGZpcnN0IGZhY3RvciBjb3JyZXNwb25kZWQgcHJpbWFyaWx5IHRvIHBoeXNpb2xvZ2ljYWwgc2Vuc2F0aW9ucywgYXMgd2VsbCBhcyBzb21lIHBvc2l0aXZlIGVtb3Rpb25zLiBBbiBhbmFseXNpcyBvZiBmYWN0b3IgY29uZ3J1ZW5jZSBpbmRpY2F0ZWQgdGhhdCB0aGlzIGZhY3RvciB3YXMgbW9zdCBzaW1pbGFyIHRvIGFkdWx0cycgX0JPRFlfIGZhY3RvciAoY29zaW5lIHNpbWlsYXJpdHkgd2l0aCBfQk9EWV86IGByIGNvbmdfZWZhXzNfZDJfYWRfNDZbIkYxIiwgIkYxIl1gKSwgYnV0IHdhcyBhbHNvIHF1aXRlIHNpbWlsYXIgdG8gYWR1bHRzJyBfSEVBUlRfIGZhY3RvciAoY29zaW5lIHNpbWlsYXJpdHkgd2l0aCBfSEVBUlRfOiBgciBjb25nX2VmYV8zX2QyX2FkXzQ2WyJGMSIsICJGMiJdYDsgd2l0aCBfTUlORF86IGByIGNvbmdfZWZhXzNfZDJfYWRfNDZbIkYxIiwgIkYzIl1gKS4gSXQgd2FzIHRoZSBkb21pbmFudCBmYWN0b3IgZm9yIHN1Y2ggaXRlbXMgYXMgYHIgdG9wX25fZG9tQ2FwKGVmYV8zX2QyXzQ2LCA0LCAiRjEiLCAicG9zIilgLCBhbmQgYWNjb3VudGVkIGZvciBgciByb3VuZChlZmFfM19kMl80NiRWYWNjb3VudGVkWyJQcm9wb3J0aW9uIEV4cGxhaW5lZCIsICJGMSJdLCAyKSAqIDEwMGAlIG9mIHRoZSBzaGFyZWQgdmFyaWFuY2UgaW4gdGhlIHJvdGF0ZWQgdGhyZWUtZmFjdG9yIHNvbHV0aW9uLiAKClRoZSBzZWNvbmQgZmFjdG9yIGNvcnJlc3BvbmRlZCBwcmltYXJpbHkgdG8gcGVyY2VwdHVhbC1jb2duaXRpdmUgYWJpbGl0aWVzLCBhcyB3ZWxsIGFzIG9uZSBjb21wbGV4IG5lZ2F0aXZlIGVtb3Rpb24gKF9mZWVsIGd1aWx0eV8pLiBBbiBhbmFseXNpcyBvZiBmYWN0b3IgY29uZ3J1ZW5jZSBjb25maXJtZWQgdGhhdCB0aGlzIGZhY3RvciB3YXMgbW9zdCBzaW1pbGFyIHRvIGFkdWx0cycgX01JTkRfIGZhY3RvciAoY29zaW5lIHNpbWlsYXJpdHkgd2l0aCBfTUlORF86IGByIGNvbmdfZWZhXzNfZDJfYWRfNDZbIkYyIiwgIkYzIl1gOyB3aXRoIF9IRUFSVF86IGByIGNvbmdfZWZhXzNfZDJfYWRfNDZbIkYyIiwgIkYyIl1gOyB3aXRoIF9CT0RZXzogYHIgY29uZ19lZmFfM19kMl9hZF80NlsiRjIiLCAiRjEiXWApLiBJdCB3YXMgdGhlIGRvbWluYW50IGZhY3RvciBmb3Igc3VjaCBpdGVtcyBhcyBgciB0b3Bfbl9kb21DYXAoZWZhXzNfZDJfNDYsIDQsICJGMiIsICJwb3MiKWAsIGFuZCBhY2NvdW50ZWQgZm9yIGByIHJvdW5kKGVmYV8zX2QyXzQ2JFZhY2NvdW50ZWRbIlByb3BvcnRpb24gRXhwbGFpbmVkIiwgIkYyIl0sIDIpICogMTAwYCUgb2YgdGhlIHNoYXJlZCB2YXJpYW5jZSBpbiB0aGUgcm90YXRlZCB0aHJlZS1mYWN0b3Igc29sdXRpb24uIAoKVGhlIHRoaXJkIGZhY3RvciBjb3JyZXNwb25kZWQgcHJpbWFyaWx5IHRvIHNvY2lhbC1lbW90aW9uYWwgYWJpbGl0aWVzLCB3aXRoIHBhcnRpY3VsYXJseSBzdHJvbmcgbG9hZGluZ3MgZm9yIHBvc2l0aXZlIGVtb3Rpb25zLiBBbiBhbmFseXNpcyBvZiBmYWN0b3IgY29uZ3J1ZW5jZSBpbmRpY2F0ZWQgdGhhdCB0aGlzIGZhY3RvciB3YXMgbW9zdCBzaW1pbGFyIHRvIGFkdWx0cycgX0hFQVJUXyBmYWN0b3IgKGNvc2luZSBzaW1pbGFyaXR5IHdpdGggX0hFQVJUXzogYHIgY29uZ19lZmFfM19kMl9hZF80NlsiRjMiLCAiRjIiXWApLCBidXQgYWxzbyBxdWl0ZSBzaW1pbGFyIHRvIGFkdWx0cycgX0JPRFlfIGZhY3RvciAoY29zaW5lIHNpbWlsYXJpdHkgd2l0aCBfQk9EWV86IGByIGNvbmdfZWZhXzNfZDJfYWRfNDZbIkYzIiwgIkYxIl1gOyB3aXRoIF9NSU5EXzogYHIgY29uZ19lZmFfM19kMl9hZF80NlsiRjMiLCAiRjMiXWApLiBJdCB3YXMgdGhlIGRvbWluYW50IGZhY3RvciBmb3Igc3VjaCBpdGVtcyBhcyBgciB0b3Bfbl9kb21DYXAoZWZhXzNfZDJfNDYsIDQsICJGMyIsICJwb3MiKWAsIGFuZCBhY2NvdW50ZWQgZm9yIGByIHJvdW5kKGVmYV8zX2QyXzQ2JFZhY2NvdW50ZWRbIlByb3BvcnRpb24gRXhwbGFpbmVkIiwgIkYzIl0sIDIpICogMTAwYCUgb2YgdGhlIHNoYXJlZCB2YXJpYW5jZSBpbiB0aGUgcm90YXRlZCB0aHJlZS1mYWN0b3Igc29sdXRpb24uIChTZWUgRmlndXJlIDUsIFBhbmVsIEIsIGZvciBhbGwgZmFjdG9yIGxvYWRpbmdzLikKCldlIHdvdWxkIGRlc2NyaWJlIHRoaXMgY29uY2VwdHVhbCBzdHJ1Y3R1cmUgYXMgcmVtaW5pc2NlbnQgb2YgdGhlIF9CT0RZXy1fSEVBUlRfLV9NSU5EXyBzdHJ1Y3R1cmUgZm91bmQgYW1vbmcgb2xkZXIgY2hpbGRyZW4gYW5kIGFkdWx0cywgYnV0IG5vdCBhcyBmdWxseSAiYWR1bHQtbGlrZS4iIEluIHBhcnRpY3VsYXIsIGluIHRoaXMgc3RydWN0dXJlLCB0aGUgcGh5c2lvbG9naWNhbCBzZW5zYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgX0JPRFlfIGFtb25nIG9sZGVyIGNoaWxkcmVuIGFuZCBhZHVsdHMgYXJlIG5vdCBhcyBjbGVhcmx5IGRpZmZlcmVudGlhdGVkIGZyb20gdGhlIGVtb3Rpb25hbCBleHBlcmllbmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIF9IRUFSVF8uIEluZGVlZCwgaXQgaXQgbm90IGNsZWFyIHRoYXQgX0JPRFlfIHZzLiBfSEVBUlRfIGlzIHRoZSBtb3N0IHNhbGllbnQgZGlzdGluY3Rpb24gYW1vbmcgdGhlIGZpcnN0IGFuZCB0aGlyZCBmYWN0b3JzIGluIHRoaXMgc29sdXRpb246IEEgY2xlYW5lciBkZXNjcmlwdGlvbiBvZiB0aGVzZSBmYWN0b3JzIG1pZ2h0IGJlIG5lZ2F0aXZlbHktdmFsZW5jZWQgZXhwZXJpZW5jZXMgdnMuIHBvc2l0aXZlbHktdmFsZW5jZWQgZXhwZXJpZW5jZXMuIAoKIyMjIyBUd28tZmFjdG9yIHNvbHV0aW9uCgpgYGB7cn0KZWZhXzJfZDJfNDYgPC0gZmFfZnVuKGQyXzQ2X3dpZGVfaSwgMikKCmVmYV8yX3Bsb3RfZDJfNDYgPC0gaGVhdG1hcF9mdW4oZWZhXzJfZDJfNDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gYygiQk9EWS1IRUFSVCIsICJNSU5EIikpICsKICBsYWJzKHRpdGxlID0gcGFzdGUwKCJZb3VuZ2VyIGNoaWxkcmVuICg0LTZ5LCBuPSIsIG5yb3coZDJfNDZfd2lkZV9pKSwgIik6IDItZmFjdG9yIHNvbHV0aW9uIikpCmBgYAoKYGBge3J9CmNvbmdfZWZhXzJfZDJfYWRfNDYgPC0gZmEuY29uZ3J1ZW5jZShlZmFfMl9kMl80NiRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV8zX2QyX2FkJGxvYWRpbmdzKQpgYGAKCkluIHRoZSByb3RhdGVkIHR3by1mYWN0b3Igc29sdXRpb24gc3VnZ2VzdGVkIGJ5IHBhcmFsbGVsIGFuYWx5c2lzLCB0aGUgZmlyc3QgZmFjdG9yIGVuY29tcGFzc2VkIGJvdGggcGh5c2lvbG9naWNhbCBzZW5zYXRpb25zIGFuZCBlbW90aW9ucy4gQW4gYW5hbHlzaXMgb2YgZmFjdG9yIGNvbmdydWVuY2UgaW5kaWNhdGVkIHRoYXQgdGhpcyBmYWN0b3Igd2FzIG1vc3Qgc2ltaWxhciB0byBhZHVsdHMnIF9CT0RZXyBmYWN0b3IgKGNvc2luZSBzaW1pbGFyaXR5IHdpdGggX0JPRFlfOiBgciBjb25nX2VmYV8yX2QyX2FkXzQ2WyJGMSIsICJGMSJdYCksIGJ1dCB3YXMgYWxzbyBxdWl0ZSBzaW1pbGFyIHRvIGFkdWx0cycgX0hFQVJUXyBmYWN0b3IgKGNvc2luZSBzaW1pbGFyaXR5IHdpdGggX0hFQVJUXzogYHIgY29uZ19lZmFfMl9kMl9hZF80NlsiRjEiLCAiRjIiXWA7IHdpdGggX01JTkRfOiBgciBjb25nX2VmYV8yX2QyX2FkXzQ2WyJGMSIsICJGMyJdYCkuIEl0IHdhcyB0aGUgZG9taW5hbnQgZmFjdG9yIGZvciBzdWNoIGl0ZW1zIGFzIGByIHRvcF9uX2RvbUNhcChlZmFfMl9kMl80NiwgNCwgIkYxIiwgInBvcyIpYCwgYW5kIGFjY291bnRlZCBmb3IgYHIgcm91bmQoZWZhXzJfZDJfNDYkVmFjY291bnRlZFsiUHJvcG9ydGlvbiBFeHBsYWluZWQiLCAiRjEiXSwgMikgKiAxMDBgJSBvZiB0aGUgc2hhcmVkIHZhcmlhbmNlIGluIHRoZSByb3RhdGVkIHR3by1mYWN0b3Igc29sdXRpb24uIAoKVGhlIHNlY29uZCBmYWN0b3IgY29ycmVzcG9uZGVkIHByaW1hcmlseSB0byBwZXJjZXB0dWFsLWNvZ25pdGl2ZSBhYmlsaXRpZXMsIGFzIHdlbGwgYXMgb25lIGNvbXBsZXggbmVnYXRpdmUgZW1vdGlvbiAoX2ZlZWwgZ3VpbHR5XykuIEFuIGFuYWx5c2lzIG9mIGZhY3RvciBjb25ncnVlbmNlIGNvbmZpcm1lZCB0aGF0IHRoaXMgZmFjdG9yIHdhcyBtb3N0IHNpbWlsYXIgdG8gYWR1bHRzJyBfTUlORF8gZmFjdG9yIChjb3NpbmUgc2ltaWxhcml0eSB3aXRoIF9NSU5EXzogYHIgY29uZ19lZmFfMl9kMl9hZF80NlsiRjIiLCAiRjMiXWA7IHdpdGggX0hFQVJUXzogYHIgY29uZ19lZmFfMl9kMl9hZF80NlsiRjIiLCAiRjIiXWA7IHdpdGggX0JPRFlfOiBgciBjb25nX2VmYV8yX2QyX2FkXzQ2WyJGMiIsICJGMSJdYCkuIEl0IHdhcyB0aGUgZG9taW5hbnQgZmFjdG9yIGZvciBzdWNoIGl0ZW1zIGFzIGByIHRvcF9uX2RvbUNhcChlZmFfMl9kMl80NiwgNCwgIkYyIiwgInBvcyIpYCwgYW5kIGFjY291bnRlZCBmb3IgYHIgcm91bmQoZWZhXzJfZDJfNDYkVmFjY291bnRlZFsiUHJvcG9ydGlvbiBFeHBsYWluZWQiLCAiRjIiXSwgMikgKiAxMDBgJSBvZiB0aGUgc2hhcmVkIHZhcmlhbmNlIGluIHRoZSByb3RhdGVkIHRocmVlLWZhY3RvciBzb2x1dGlvbi4gKFNlZSBGaWd1cmUgNSwgUGFuZWwgQSwgZm9yIGFsbCBmYWN0b3IgbG9hZGluZ3MuKQoKSW4gcmVsYXRpb24gdG8gdGhlIF9CT0RZXy1fSEVBUlQtX01JTkRfIHN0cnVjdHVyZSBmb3VuZCBhbW9uZyBvbGRlciBjaGlsZHJlbiBhbmQgYWR1bHRzLCB3ZSB3b3VsZCBkZXNjcmliZSB0aGlzIHR3by1mYWN0b3Igc3RydWN0dXJlIGFzIGJlaW5nIGFuY2hvcmVkIGJ5IGEgY29udHJhc3QgYmV0d2VlbiB0aGUgY29nbml0aXZlIGNhcGFjaXRpZXMgb2YgdGhlIF9NSU5EXyB2cy4gYSBzZXQgb2Ygd2FybWVyLCBtb3JlIHZpc2VyY2FsIGV4cGVyaWVuY2VzIHRoYXQgY29uc3RpdHV0ZSBhIG1vcmUgaW50ZWdyYXRlZCByZXByZXNlbnRhdGlvbiBvZiBfQk9EWS1IRUFSVF8uCgpgYGB7ciwgaW5jbHVkZSA9IFQsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAxfQpmaWcwNV9wbG90cyA8LSBwbG90X2dyaWQoZWZhXzJfcGxvdF9kMl80NiwgZWZhXzNfcGxvdF9kMl80NiwgCiAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfM19wbG90X2QyXzc5LCBlZmFfM19wbG90X2QyX2FkLAogICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQSIsICJCIiwgIkMiLCAiRCIpKQpmaWcwNV93aXRoX2NhcHRpb24gPC0gYWRkX3N1YihmaWcwNV9wbG90cywgc3RyX3dyYXAoIkZpZ3VyZSA1OiBFeHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzaXMgcmVzdWx0cyBmb3IgNC0gdG8gNi15ZWFyLW9sZCBjaGlsZHJlbiAoQS1CKSwgNy0gdG8gOS15ZWFyLW9sZCBjaGlsZHJlbiAoQikgYW5kIGFkdWx0cyAoQykgaW4gU3R1ZHkgMiwgaW4gd2hpY2ggZWFjaCBwYXJ0aWNpcGFudCBhc3Nlc3NlZCAyMCBtZW50YWwgY2FwYWNpdGllcyBmb3Igb25lIG9mIG5pbmUgdGFyZ2V0IGNoYXJhY3RlcnM6IGEgY29tcHV0ZXIsIGEgcm9ib3QsIGEgZG9sbCwgYSB0ZWRkeSBiZWFyLCBhIGJlZXRsZSwgYSBiaXJkLCBhIG1vdXNlLCBhIGdvYXQsIG9yIGFuIGVsZXBoYW50LiBGb3IgeW91bmdlciBjaGlsZHJlbiwgd2UgaW5jbHVkZSBib3RoIHRoZSB0d28tZmFjdG9yIHNvbHV0aW9uIHN1Z2dlc3RlZCBieSBwYXJhbGxlbCBhbmFseXNpcyAoQSkgYW5kIHRoZSB0aHJlZS1mYWN0b3Igc29sdXRpb24gc3VnZ2VzdGVkIGJ5IFdlaXNtYW4gZXQgYWwuJ3MgKDIwMTcpIGZhY3RvciByZXRlbnRpb24gY3JpdGVyaWEgKEIpLiIsIDE0MyksIHggPSAwLCBoanVzdCA9IDApCmdnZHJhdyhmaWcwNV93aXRoX2NhcHRpb24pCmBgYAoKIyMjIEF0dHJpYnV0aW9ucyBvZiBtZW50YWwgbGlmZQoKSW4gU3R1ZHkgMSwgd2Ugc2F3IHRoYXQgZXZlbiBjaGlsZHJlbiBhcyBvbGQgYXMgNy05eeKAlHdob3NlIGNvbmNlcHR1YWwgc3RydWN0dXJlIHNlZW1lZCB0byBiZSBxdWl0ZSBzaW1pbGFyIHRvIHRoYXQgb2YgYWR1bHRzJ+KAlG5vbmV0aGVsZXNzIGRpZmZlcmVkIGZyb20gYWR1bHRzIGluIHRoZWlyIF9hcHBsaWNhdGlvbl8gb2YgdGhpcyBjb25jZXB0LCBhdHRyaWJ1dGluZyBmYXIgbW9yZSBvZiB0aGUgc29jaWFsLWVtb3Rpb25hbCBhYmlsaXRpZXMgcmVsYXRlZCB0byB0aGUgX0hFQVJUXyB0byBib3RoIGJlZXRsZXMgYW5kIHJvYm90cy4gSG93IGRvIGNoaWxkcmVuJ3MgbWVudGFsIGNhcGFjaXR5IGF0dHJpYnV0aW9ucyBjb21wYXJlIHRvIGFkdWx0cyBmb3IgdGhlIGxhcmdlciBzZXQgb2YgdGFyZ2V0IGNoYXJhY3RlcnMgaW5jbHVkZWQgaW4gU3R1ZHkgMuKAlGFuZCB3aGF0IGRvZXMgdGhpcyBhc3BlY3Qgb2YgY29uY2VwdHVhbCBkZXZlbG9wbWVudGFsIGxvb2sgbGlrZSBlYXJsaWVyIGluIGRldmVsb3BtZW50ICg0LTZ5KT8KCiMjIyMgRGlmZmVyZW5jZXMgYWNyb3NzIGFnZSBncm91cHMKCmBgYHtyfQpkMl9hbGxfd2lkZV9pIDwtIGQyX2FkX3dpZGVfaSAlPiUKICByb3duYW1lc190b19jb2x1bW4oInN1YmlkX2NoYXIiKSAlPiUKICBmdWxsX2pvaW4oZDJfNzlfd2lkZV9pICU+JQogICAgICAgICAgICAgIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWRfY2hhciIpKSAlPiUKICBmdWxsX2pvaW4oZDJfNDZfd2lkZV9pICU+JQogICAgICAgICAgICAgIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWRfY2hhciIpKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInN1YmlkX2NoYXIiKQpgYGAKCmBgYHtyfQplZmFfM19kMl83OV9wcm9qZWN0X3Njb3JlcyA8LSBwcmVkaWN0KG9iamVjdCA9IGVmYV8zX2QyX2FkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkMl83OV93aWRlX2ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkLmRhdGEgPSBkMl9hZF93aWRlX2kpICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oInN1YmlkX2NoYXIiKSAlPiUKICBtdXRhdGUoc3ViaWQgPSBnc3ViKCJfLiokIiwgIiIsIHN1YmlkX2NoYXIpLAogICAgICAgICBjaGFyYWN0ZXIgPSBnc3ViKCJeLipfIiwgIiIsIHN1YmlkX2NoYXIpLAogICAgICAgICBhZ2VfZ3JvdXAgPSAiY2hpbGRyZW43OSIpICU+JQogIGdhdGhlcihmYWN0b3IsIHNjb3JlLCAtYyhzdWJpZCwgY2hhcmFjdGVyLCBzdWJpZF9jaGFyLCBhZ2VfZ3JvdXApKSAlPiUKICBtdXRhdGUoZmFjdG9yX25hbWUgPSByZWNvZGVfZmFjdG9yKGZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGMSIgPSAiQk9EWSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRjIiID0gIkhFQVJUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGMyIgPSAiTUlORCIpKSAlPiUKICBhcnJhbmdlKHN1YmlkX2NoYXIpCmBgYAoKYGBge3J9CmVmYV8zX2QyXzQ2X3Byb2plY3Rfc2NvcmVzIDwtIHByZWRpY3Qob2JqZWN0ID0gZWZhXzNfZDJfYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGQyXzQ2X3dpZGVfaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQuZGF0YSA9IGQyX2FkX3dpZGVfaSkgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWRfY2hhciIpICU+JQogIG11dGF0ZShzdWJpZCA9IGdzdWIoIl8uKiQiLCAiIiwgc3ViaWRfY2hhciksCiAgICAgICAgIGNoYXJhY3RlciA9IGdzdWIoIl4uKl8iLCAiIiwgc3ViaWRfY2hhciksCiAgICAgICAgIGFnZV9ncm91cCA9ICJjaGlsZHJlbjQ2IikgJT4lCiAgZ2F0aGVyKGZhY3Rvciwgc2NvcmUsIC1jKHN1YmlkLCBjaGFyYWN0ZXIsIHN1YmlkX2NoYXIsIGFnZV9ncm91cCkpICU+JQogIG11dGF0ZShmYWN0b3JfbmFtZSA9IHJlY29kZV9mYWN0b3IoZmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkYxIiA9ICJCT0RZIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGMiIgPSAiSEVBUlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkYzIiA9ICJNSU5EIikpICU+JQogIGFycmFuZ2Uoc3ViaWRfY2hhcikKYGBgCgpGb2xsb3dpbmcgU3R1ZHkgMSwgd2UgcHJvamVjdGVkIGFsbCBvZiBjaGlsZHJlbidzIHJlc3BvbnNlcyBpbnRvIHRoZSBmYWN0b3Igc3BhY2UgZGVmaW5lZCBieSBhZHVsdHMgKHN0YW5kYXJkaXplZCBpbiB0ZXJtcyBvZiBhZHVsdHMnIHJlc3BvbnNlcyksIGFuZCBleGFtaW5lZCBmYWN0b3Igc2NvcmVzIGJ5IGFnZSBncm91cCAoYWdhaW4sIHVzaW5nIHRoZSBtZXRob2QgYXJ0aWN1bGF0ZWQgYnkgdGVuIEJlcmdlIGV0IGFsLiwgMTk5OSkuIEFzIGluIFN0dWR5IDEsIHRoaXMgeWllbGRlZCB0aHJlZSBzY29yZXMgZm9yIGVhY2ggcGFydGljaXBhbnQsIGNvcnJlc3BvbmRpbmcsIGluIHByaW5jaXBsZSwgdG8gaG9saXN0aWMganVkZ21lbnRzIG9mIHRoZSBzb2NpYWwtZW1vdGlvbmFsLCBwaHlzaW9sb2dpY2FsLCBhbmQgcGVyY2VwdHVhbC1jb2duaXRpdmUgYWJpbGl0aWVzIG9mIHRoZSB0YXJnZXQgY2hhcmFjdGVyIHRoZSBwYXJ0aWNpcGFudCBldmFsdWF0ZWQuIChOb3RlIHRoYXQgZWFjaCBvZiB0aGVzZSB0aHJlZSBzY29yZXMgdGFrZXMgaW50byBhY2NvdW50IGFkdWx0IGZhY3RvciBsb2FkaW5ncyBmb3IgYWxsIDIwIG1lbnRhbCBjYXBhY2l0aWVzLCBhcyBzaG93biBpbiBGaWd1cmUgNSwgUGFuZWwgRC4pIApUaGlzIGFsbG93ZWQgdXMgdG8gZXhhbWluZSB0aGUgZWZmZWN0cyBvZiBhZ2UgZ3JvdXAgKHlvdW5nZXIgY2hpbGRyZW4sIG9sZGVyIGNoaWxkcmVuLCBhZHVsdHMpLCBmYWN0b3IgKF9CT0RZXywgX0hFQVJUXywgX01JTkRfKSwgYW5kIHRhcmdldCBjaGFyYWN0ZXIgb24gdGhlc2Ugc2NvcmVzIHZpYSBtaXhlZCBlZmZlY3RzIEJheWVzaWFuIHJlZ3Jlc3Npb24uIEFzIGluIFN0dWR5IDEsIGZhY3RvciB3YXMgZWZmZWN0LWNvZGVkLCBhbmQgYWdlIGdyb3VwIHdhcyBkdW1teS1jb2RlZCB3aXRoIGFkdWx0cyBhcyB0aGUgYmFzZWxpbmUsIHRvIGFzc2VzcyB3aGV0aGVyIGNoaWxkcmVuIGluIGVhY2ggYWdlIGdyb3VwIHdlcmUgImFkdWx0LWxpa2UiIGluIHRoZWlyIGFzc2Vzc21lbnRzLiBUbyBleGFtaW5lIGRpZmZlcmVuY2VzIGluIG1lbnRhbCBjYXBhY2l0eSBhdHRyaWJ1dGlvbnMgdG8gZGlmZmVyZW50IHRhcmdldCBjaGFyYWN0ZXJzLCB3ZSBjb2RlZCBlYWNoIGNoYXJhY3RlciBhcyBlaXRoZXIgImFuaW1hdGUiIChlbGVwaGFudCwgZ29hdCwgbW91c2UsIGJpcmQsIGJlZXRsZSkgb3IgImluYW5pbWF0ZSIgKGNvbXB1dGVyLCByb2JvdCwgZG9sbCwgdGVkZHkgYmVhciksIGFuZCBpbmNsdWRlZCBhbmltYWN5IHN0YXR1cyAoZWZmZWN0LWNvZGVkKSBhcyBhIGZpeGVkIGVmZmVjdCBpbiBvdXIgcmVncmVzc2lvbiBtb2RlbC4gV2UgaW5jbHVkZWQgaW50ZXJjZXB0cyBhbmQgc2xvcGVzIGZvciBpbmRpdmlkdWFsIGNoYXJhY3RlcnMgYXMgcmFuZG9tIGVmZmV0cyBpbiBvdXIgbW9kZWwsIGFsb25nIHdpdGggaW50ZXJjZXB0cyBmb3IgaW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMuW14xXQoKW14xXTogV2Ugbm90ZXMgdGhhdCB0aGUgY29tcGxleGl0aWVzIG9mIHRoZSBkZXNpZ24gb2YgU3R1ZHkgMiBjb3VsZCBsZW5kIHRoZW1zZWx2ZXMgdG8gbW9yZSBjb21wbGV4IG1vZGVscyB0aGFuIHdoYXQgd2UgaGF2ZSBwcmVzZW50ZWQgaGVyZSwgYW5kIHdlIGVuY291cmFnZSByZWFkZXJzIHRvIGV4YW1pbmUgYSBtb2RlbCBpbmNsdWRpbmcgbXVsdGlwbGUgY29tcGFyaXNvbnMgYmV0d2VlbiBzZXRzIG9mIGNoYXJhY3RlcnMgKGUuZy4sIG1hbW1hbHMgdnMuIG5vbi1tYW1tYWxzOyB0ZWNobm9sb2dpZXMgdnMuIHRveXMpIHByZXNlbnRlZCBpbiB0aGUgU09NLiBBbGwgb2YgdGhlIGVmZmVjdHMgZGVzY3JpYmVkIGJlbG93IGFsc28gaG9sZCB0cnVlIGluIHRoaXMgbW9yZSBjb21wbGV4IG1vZGVsLgoKVGhlIHJlc3VsdHMgb2YgdGhpcyBtb2RlbCBjYW4gYmUgZm91bmQgaW4gVGFibGUgMy4gCgpgYGB7cn0KZWZhXzNfc2NvcmVzX2QyX2FsbCA8LSBlZmFfM19kMl9hZCRzY29yZXMgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWRfY2hhciIpICU+JQogIGdhdGhlcihmYWN0b3IsIHNjb3JlLCAtc3ViaWRfY2hhcikgJT4lCiAgbXV0YXRlKHN1YmlkID0gZ3N1YigiX2NvbXB1dGVyIiwgIiIsIHN1YmlkX2NoYXIpLAogICAgICAgICBzdWJpZCA9IGdzdWIoIl9yb2JvdCIsICIiLCBzdWJpZCksCiAgICAgICAgIHN1YmlkID0gZ3N1YigiX2RvbGwiLCAiIiwgc3ViaWQpLAogICAgICAgICBzdWJpZCA9IGdzdWIoIl90ZWRkeV9iZWFyIiwgIiIsIHN1YmlkKSwKICAgICAgICAgc3ViaWQgPSBnc3ViKCJfYmVldGxlIiwgIiIsIHN1YmlkKSwKICAgICAgICAgc3ViaWQgPSBnc3ViKCJfYmlyZCIsICIiLCBzdWJpZCksCiAgICAgICAgIHN1YmlkID0gZ3N1YigiX21vdXNlIiwgIiIsIHN1YmlkKSwKICAgICAgICAgc3ViaWQgPSBnc3ViKCJfZ29hdCIsICIiLCBzdWJpZCksCiAgICAgICAgIHN1YmlkID0gZ3N1YigiX2VsZXBoYW50IiwgIiIsIHN1YmlkKSwKICAgICAgICAgY2hhcmFjdGVyID0gZ3N1YigiXi4qXyIsICIiLCBzdWJpZF9jaGFyKSwKICAgICAgICAgYWdlX2dyb3VwID0gImFkdWx0cyIsCiAgICAgICAgIGZhY3Rvcl9uYW1lID0gcmVjb2RlX2ZhY3RvcihmYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRjEiID0gIkJPRFkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkYyIiA9ICJIRUFSVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRjMiID0gIk1JTkQiKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgZnVsbF9qb2luKGVmYV8zX2QyXzc5X3Byb2plY3Rfc2NvcmVzICU+JSAKICAgICAgICAgICAgICBsZWZ0X2pvaW4oZDJfNzkgJT4lIGRpc3RpbmN0KHN1YmlkLCBhZ2VfZ3JvdXAsIGFnZSkpKSAlPiUKICBmdWxsX2pvaW4oZWZhXzNfZDJfNDZfcHJvamVjdF9zY29yZXMgJT4lIAogICAgICAgICAgICAgIGxlZnRfam9pbihkMl80NiAlPiUgZGlzdGluY3Qoc3ViaWQsIGFnZV9ncm91cCwgYWdlKSkpICU+JQogIG11dGF0ZShjaGFyYWN0ZXIgPSBjYXNlX3doZW4oCiAgICBncmVwbCgiYmVhciIsIGFzLmNoYXJhY3RlcihjaGFyYWN0ZXIpKSB+ICJ0ZWRkeSBiZWFyIiwgCiAgICBUUlVFIH4gYXMuY2hhcmFjdGVyKGNoYXJhY3RlcikpKSAlPiUKICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiZmFjdG9yIiksIGNoYXJhY3RlciwgYWdlX2dyb3VwKSwgZnVucyhmYWN0b3IpKSAlPiUKICBtdXRhdGUoY2hhcmFjdGVyID0gZmFjdG9yKGNoYXJhY3RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImNvbXB1dGVyIiwgInJvYm90IiwgImRvbGwiLCAidGVkZHkgYmVhciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWV0bGUiLCAiYmlyZCIsICJtb3VzZSIsICJnb2F0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVsZXBoYW50IikpLAogICAgICAgICBhZ2VfZ3JvdXAgPSBmYWN0b3IoYWdlX2dyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiY2hpbGRyZW40NiIsICJjaGlsZHJlbjc5IiwgImFkdWx0cyIpKSkKCmVmYV8zX3Njb3Jlc19ib290X2QyX2FsbCA8LSBlZmFfM19zY29yZXNfZDJfYWxsICU+JQogIGdyb3VwX2J5KGFnZV9ncm91cCwgZmFjdG9yLCBmYWN0b3JfbmFtZSwgY2hhcmFjdGVyKSAlPiUKICBtdWx0aV9ib290X3N0YW5kYXJkKGNvbCA9ICJzY29yZSIpICU+JQogIHVuZ3JvdXAoKQpgYGAKCmBgYHtyfQpjb250cmFzdHMoZWZhXzNfc2NvcmVzX2QyX2FsbCRjaGFyYWN0ZXIpIDwtIGNiaW5kKAogICJhbmltX2luYW4iID0gYygtNSwgLTUsIC01LCAtNSwgNCwgNCwgNCwgNCwgNCksCiAgIm1hbW1fbm9ubSIgPSBjKDAsIDAsIDAsIDAsIC0zLCAtMywgMiwgMiwgMiksCiAgImVsZXBfZ29tbyIgPSBjKDAsIDAsIDAsIDAsIDAsIDAsIC0xLCAtMSwgMiksCiAgImdvYXRfbW91cyIgPSBjKDAsIDAsIDAsIDAsIDAsIDAsIC0xLCAxLCAwKSwKICAiYmlyZF9iZWV0IiA9IGMoMCwgMCwgMCwgMCwgLTEsIDEsIDAsIDAsIDApLAogICJ0ZWNoX3RveXMiID0gYygxLCAxLCAtMSwgLTEsIDAsIDAsIDAsIDAsIDApLAogICJyb2JvX2NvbXAiID0gYygtMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCksCiAgInRlZGRfZG9sbCIgPSBjKDAsIDAsIC0xLCAxLCAwLCAwLCAwLCAwLCAwKSkKY29udHJhc3RzKGVmYV8zX3Njb3Jlc19kMl9hbGwkYWdlX2dyb3VwKSA8LSBjYmluZCgiQ0g0Nl9BRCIgPSBjKDEsIDAsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDSDc5X0FEIiA9IGMoMCwgMSwgMCkpCmNvbnRyYXN0cyhlZmFfM19zY29yZXNfZDJfYWxsJGZhY3Rvcl9uYW1lKSA8LSBjYmluZCgiSF9HTSIgPSBjKC0xLCAxLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNX0dNIiA9IGMoLTEsIDAsIDEpKQoKIyBlZmFfM19zY29yZXNfcl9kMl9hbGwgPC0gYnJtKHNjb3JlIH4gZmFjdG9yX25hbWUgKiBhZ2VfZ3JvdXAgKiBjaGFyYWN0ZXIKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKDF8c3ViaWQpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGVmYV8zX3Njb3Jlc19kMl9hbGwsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVkID0gMTIzNDUsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlcyA9IDQsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gbGlzdChhZGFwdF9kZWx0YSA9IDAuOTkpKQojIHNhdmVSRFMoZWZhXzNfc2NvcmVzX3JfZDJfYWxsLCBmaWxlID0gIi4vYnJtc19tb2RlbHMvZWZhXzNfc2NvcmVzX3JfZDJfYWxsLnJkcyIpCgplZmFfM19zY29yZXNfcl9kMl9hbGwgPC0gcmVhZFJEUyhmaWxlID0gIi4vYnJtc19tb2RlbHMvZWZhXzNfc2NvcmVzX3JfZDJfYWxsLnJkcyIpCiMgc3VtbWFyeShlZmFfM19zY29yZXNfcl9kMl9hbGwpCmBgYAoKYGBge3IsIHJlc3VsdHMgPSAiYXNpcyJ9CiMgZnVsbCBtb2RlbAojIGZpeGVmKGVmYV8zX3Njb3Jlc19yX2QyX2FsbCkgJT4lIAojICAgZGF0YS5mcmFtZSgpICU+JQojICAgcm93bmFtZXNfdG9fY29sdW1uKCJQYXJhbWV0ZXIiKSAlPiUKIyAgIG11dGF0ZShQYXJhbWV0ZXIgPSByZWNvZGVfZmFjdG9yKFBhcmFtZXRlciwKIyAgICAgIkludGVyY2VwdCIgPSAiKEludGVyY2VwdCkiLAojICAgICAiY2hhcmFjdGVyYW5pbV9pbmFuIiA9ICJjaGFyYWN0ZXJzOiBhbmltYXRlcyB2cy4gaW5hbmltYXRlcyIsCiMgICAgICJjaGFyYWN0ZXJtYW1tX25vbm0iID0gImNoYXJhY3RlcnM6IG1hbW1hbHMgdnMuIG90aGVyIGFuaW1hbHMiLAojICAgICAiY2hhcmFjdGVyZWxlcF9nb21vIiA9ICJjaGFyYWN0ZXJzOiBlbGVwaGFudCB2cy4gb3RoZXIgbWFtbWFscyIsCiMgICAgICJjaGFyYWN0ZXJnb2F0X21vdXMiID0gImNoYXJhY3RlcnM6IGdvYXQgdnMuIG1vdXNlIiwKIyAgICAgImNoYXJhY3RlcmJpcmRfYmVldCIgPSAiY2hhcmFjdGVyczogYmlyZCB2cy4gYmVldGxlIiwKIyAgICAgImNoYXJhY3RlcnRlY2hfdG95cyIgPSAiY2hhcmFjdGVyczogdGVjaG5vbG9naWVzIHZzLiB0b3lzIiwKIyAgICAgImNoYXJhY3RlcnJvYm9fY29tcCIgPSAiY2hhcmFjdGVyczogcm9ib3QgdnMuIGNvbXB1dGVyIiwKIyAgICAgImNoYXJhY3RlcnRlZGRfZG9sbCIgPSAiY2hhcmFjdGVyczogdGVkZHkgYmVhciB2cy4gZG9sbCIsCiMgICAgICJmYWN0b3JfbmFtZUhfR00iID0gIkhFQVJUICh2cy4gZ3JhbmQgbWVhbikiLAojICAgICAiZmFjdG9yX25hbWVNX0dNIiA9ICJNSU5EICh2cy4gZ3JhbmQgbWVhbikiLAojICAgICAiYWdlX2dyb3VwQ0g0Nl9BRCIgPSAiYWdlIGdyb3VwICg0LTZ5IHZzLiBhZHVsdHMpIiwKIyAgICAgImFnZV9ncm91cENINzlfQUQiID0gImFnZSBncm91cCAoNy05eSB2cy4gYWR1bHRzKSIsCiMgICAgICJmYWN0b3JfbmFtZUhfR006Y2hhcmFjdGVyYW5pbV9pbmFuIiA9ICJjaGFyYWN0ZXJzIChhbmltYXRlcy9pbmFuaW1hdGVzKSDDlyBIRUFSVCIsCiMgICAgICJmYWN0b3JfbmFtZUhfR006Y2hhcmFjdGVybWFtbV9ub25tIiA9ICJjaGFyYWN0ZXJzIChtYW1tYWxzL290aGVyIGFuaW1hbHMpIMOXIEhFQVJUIiwKIyAgICAgImZhY3Rvcl9uYW1lSF9HTTpjaGFyYWN0ZXJlbGVwX2dvbW8iID0gImNoYXJhY3RlcnMgKGVsZXBoYW50L290aGVyIG1hbW1hbHMpIMOXIEhFQVJUIiwKIyAgICAgImZhY3Rvcl9uYW1lSF9HTTpjaGFyYWN0ZXJnb2F0X21vdXMiID0gImNoYXJhY3RlcnMgKGdvYXQvbW91c2UpIMOXIEhFQVJUIiwKIyAgICAgImZhY3Rvcl9uYW1lSF9HTTpjaGFyYWN0ZXJiaXJkX2JlZXQiID0gImNoYXJhY3RlcnMgKGJpcmQvYmVldGxlKSDDlyBIRUFSVCIsCiMgICAgICJmYWN0b3JfbmFtZUhfR006Y2hhcmFjdGVydGVjaF90b3lzIiA9ICJjaGFyYWN0ZXJzICh0ZWNobm9sb2dpZXMvdG95cykgw5cgSEVBUlQiLAojICAgICAiZmFjdG9yX25hbWVIX0dNOmNoYXJhY3RlcnJvYm9fY29tcCIgPSAiY2hhcmFjdGVycyAocm9ib3QvY29tcHV0ZXIpIMOXIEhFQVJUIiwKIyAgICAgImZhY3Rvcl9uYW1lSF9HTTpjaGFyYWN0ZXJ0ZWRkX2RvbGwiID0gImNoYXJhY3RlcnMgKHRlZGR5IGJlYXIvZG9sbCkgw5cgSEVBUlQiLAojICAgICAiZmFjdG9yX25hbWVNX0dNOmNoYXJhY3RlcmFuaW1faW5hbiIgPSAiY2hhcmFjdGVycyAoYW5pbWF0ZXMvaW5hbmltYXRlcykgw5cgTUlORCIsCiMgICAgICJmYWN0b3JfbmFtZU1fR006Y2hhcmFjdGVybWFtbV9ub25tIiA9ICJjaGFyYWN0ZXJzIChtYW1tYWxzL290aGVyIGFuaW1hbHMpIMOXIE1JTkQiLAojICAgICAiZmFjdG9yX25hbWVNX0dNOmNoYXJhY3RlcmVsZXBfZ29tbyIgPSAiY2hhcmFjdGVycyAoZWxlcGhhbnQvb3RoZXIgbWFtbWFscykgw5cgTUlORCIsCiMgICAgICJmYWN0b3JfbmFtZU1fR006Y2hhcmFjdGVyZ29hdF9tb3VzIiA9ICJjaGFyYWN0ZXJzIChnb2F0L21vdXNlKSDDlyBNSU5EIiwKIyAgICAgImZhY3Rvcl9uYW1lTV9HTTpjaGFyYWN0ZXJiaXJkX2JlZXQiID0gImNoYXJhY3RlcnMgKGJpcmQvYmVldGxlKSDDlyBNSU5EIiwKIyAgICAgImZhY3Rvcl9uYW1lTV9HTTpjaGFyYWN0ZXJ0ZWNoX3RveXMiID0gImNoYXJhY3RlcnMgKHRlY2hub2xvZ2llcy90b3lzKSDDlyBNSU5EIiwKIyAgICAgImZhY3Rvcl9uYW1lTV9HTTpjaGFyYWN0ZXJyb2JvX2NvbXAiID0gImNoYXJhY3RlcnMgKHJvYm90L2NvbXB1dGVyKSDDlyBNSU5EIiwKIyAgICAgImZhY3Rvcl9uYW1lTV9HTTpjaGFyYWN0ZXJ0ZWRkX2RvbGwiID0gImNoYXJhY3RlcnMgKHRlZGR5IGJlYXIvZG9sbCkgw5cgTUlORCIsCiMgICAgICJhZ2VfZ3JvdXBDSDQ2X0FEOmNoYXJhY3RlcmFuaW1faW5hbiIgPSAiY2hhcmFjdGVycyAoYW5pbWF0ZXMvaW5hbmltYXRlcykgw5cgYWdlIGdyb3VwICg0LTZ5L2FkdWx0cykiLAojICAgICAiYWdlX2dyb3VwQ0g0Nl9BRDpjaGFyYWN0ZXJtYW1tX25vbm0iID0gImNoYXJhY3RlcnMgKG1hbW1hbHMvb3RoZXIgYW5pbWFscykgw5cgYWdlIGdyb3VwICg0LTZ5L2FkdWx0cykiLAojICAgICAiYWdlX2dyb3VwQ0g0Nl9BRDpjaGFyYWN0ZXJlbGVwX2dvbW8iID0gImNoYXJhY3RlcnMgKGVsZXBoYW50L290aGVyIG1hbW1hbHMpIMOXIGFnZSBncm91cCAoNC02eS9hZHVsdHMpIiwKIyAgICAgImFnZV9ncm91cENINDZfQUQ6Y2hhcmFjdGVyZ29hdF9tb3VzIiA9ICJjaGFyYWN0ZXJzIChnb2F0L21vdXNlKSDDlyBhZ2UgZ3JvdXAgKDQtNnkvYWR1bHRzKSIsCiMgICAgICJhZ2VfZ3JvdXBDSDQ2X0FEOmNoYXJhY3RlcmJpcmRfYmVldCIgPSAiY2hhcmFjdGVycyAoYmlyZC9iZWV0bGUpIMOXIGFnZSBncm91cCAoNC02eS9hZHVsdHMpIiwKIyAgICAgImFnZV9ncm91cENINDZfQUQ6Y2hhcmFjdGVydGVjaF90b3lzIiA9ICJjaGFyYWN0ZXJzICh0ZWNobm9sb2dpZXMvdG95cykgw5cgYWdlIGdyb3VwICg0LTZ5L2FkdWx0cykiLAojICAgICAiYWdlX2dyb3VwQ0g0Nl9BRDpjaGFyYWN0ZXJyb2JvX2NvbXAiID0gImNoYXJhY3RlcnMgKHJvYm90L2NvbXB1dGVyKSDDlyBhZ2UgZ3JvdXAgKDQtNnkvYWR1bHRzKSIsCiMgICAgICJhZ2VfZ3JvdXBDSDQ2X0FEOmNoYXJhY3RlcnRlZGRfZG9sbCIgPSAiY2hhcmFjdGVycyAodGVkZHkgYmVhci9kb2xsKSDDlyBhZ2UgZ3JvdXAgKDQtNnkvYWR1bHRzKSIsCiMgICAgICJhZ2VfZ3JvdXBDSDc5X0FEOmNoYXJhY3RlcmFuaW1faW5hbiIgPSAiY2hhcmFjdGVycyAoYW5pbWF0ZXMvaW5hbmltYXRlcykgw5cgYWdlIGdyb3VwICg3LTl5L2FkdWx0cykiLAojICAgICAiYWdlX2dyb3VwQ0g3OV9BRDpjaGFyYWN0ZXJtYW1tX25vbm0iID0gImNoYXJhY3RlcnMgKG1hbW1hbHMvb3RoZXIgYW5pbWFscykgw5cgYWdlIGdyb3VwICg3LTl5L2FkdWx0cykiLAojICAgICAiYWdlX2dyb3VwQ0g3OV9BRDpjaGFyYWN0ZXJlbGVwX2dvbW8iID0gImNoYXJhY3RlcnMgKGVsZXBoYW50L290aGVyIG1hbW1hbHMpIMOXIGFnZSBncm91cCAoNy05eS9hZHVsdHMpIiwKIyAgICAgImFnZV9ncm91cENINzlfQUQ6Y2hhcmFjdGVyZ29hdF9tb3VzIiA9ICJjaGFyYWN0ZXJzIChnb2F0L21vdXNlKSDDlyBhZ2UgZ3JvdXAgKDctOXkvYWR1bHRzKSIsCiMgICAgICJhZ2VfZ3JvdXBDSDc5X0FEOmNoYXJhY3RlcmJpcmRfYmVldCIgPSAiY2hhcmFjdGVycyAoYmlyZC9iZWV0bGUpIMOXIGFnZSBncm91cCAoNy05eS9hZHVsdHMpIiwKIyAgICAgImFnZV9ncm91cENINzlfQUQ6Y2hhcmFjdGVydGVjaF90b3lzIiA9ICJjaGFyYWN0ZXJzICh0ZWNobm9sb2dpZXMvdG95cykgw5cgYWdlIGdyb3VwICg3LTl5L2FkdWx0cykiLAojICAgICAiYWdlX2dyb3VwQ0g3OV9BRDpjaGFyYWN0ZXJyb2JvX2NvbXAiID0gImNoYXJhY3RlcnMgKHJvYm90L2NvbXB1dGVyKSDDlyBhZ2UgZ3JvdXAgKDctOXkvYWR1bHRzKSIsCiMgICAgICJhZ2VfZ3JvdXBDSDc5X0FEOmNoYXJhY3RlcnRlZGRfZG9sbCIgPSAiY2hhcmFjdGVycyAodGVkZHkgYmVhci9kb2xsKSDDlyBhZ2UgZ3JvdXAgKDctOXkvYWR1bHRzKSIsCiMgICAgICJmYWN0b3JfbmFtZUhfR006YWdlX2dyb3VwQ0g0Nl9BRCIgPSAiSEVBUlQgw5cgYWdlIGdyb3VwICg0LTZ5L2FkdWx0cykiLAojICAgICAiZmFjdG9yX25hbWVNX0dNOmFnZV9ncm91cENINDZfQUQiID0gIk1JTkQgw5cgYWdlIGdyb3VwICg0LTZ5L2FkdWx0cykiLAojICAgICAiZmFjdG9yX25hbWVIX0dNOmFnZV9ncm91cENINzlfQUQiID0gIkhFQVJUIMOXIGFnZSBncm91cCAoNy05eS9hZHVsdHMpIiwKIyAgICAgImZhY3Rvcl9uYW1lTV9HTTphZ2VfZ3JvdXBDSDc5X0FEIiA9ICJNSU5EIMOXIGFnZSBncm91cCAoNy05eS9hZHVsdHMpIiwKIyAgICAgImZhY3Rvcl9uYW1lSF9HTTphZ2VfZ3JvdXBDSDQ2X0FEOmNoYXJhY3RlcmFuaW1faW5hbiIgPSAiY2hhcmFjdGVycyAoYW5pbWF0ZXMvaW5hbmltYXRlcykgw5cgSEVBUlQgw5cgYWdlIGdyb3VwICg0LTZ5L2FkdWx0cykiLAojICAgICAiZmFjdG9yX25hbWVIX0dNOmFnZV9ncm91cENINDZfQUQ6Y2hhcmFjdGVybWFtbV9ub25tIiA9ICJjaGFyYWN0ZXJzIChtYW1tYWxzL290aGVyIGFuaW1hbHMpIMOXIEhFQVJUIMOXIGFnZSBncm91cCAoNC02eS9hZHVsdHMpIiwKIyAgICAgImZhY3Rvcl9uYW1lSF9HTTphZ2VfZ3JvdXBDSDQ2X0FEOmNoYXJhY3RlcmVsZXBfZ29tbyIgPSAiY2hhcmFjdGVycyAoZWxlcGhhbnQvb3RoZXIgbWFtbWFscykgw5cgSEVBUlQgw5cgYWdlIGdyb3VwICg0LTZ5L2FkdWx0cykiLAojICAgICAiZmFjdG9yX25hbWVIX0dNOmFnZV9ncm91cENINDZfQUQ6Y2hhcmFjdGVyZ29hdF9tb3VzIiA9ICJjaGFyYWN0ZXJzIChnb2F0L21vdXNlKSDDlyBIRUFSVCDDlyBhZ2UgZ3JvdXAgKDQtNnkvYWR1bHRzKSIsCiMgICAgICJmYWN0b3JfbmFtZUhfR006YWdlX2dyb3VwQ0g0Nl9BRDpjaGFyYWN0ZXJiaXJkX2JlZXQiID0gImNoYXJhY3RlcnMgKGJpcmQvYmVldGxlKSDDlyBIRUFSVCDDlyBhZ2UgZ3JvdXAgKDQtNnkvYWR1bHRzKSIsCiMgICAgICJmYWN0b3JfbmFtZUhfR006YWdlX2dyb3VwQ0g0Nl9BRDpjaGFyYWN0ZXJ0ZWNoX3RveXMiID0gImNoYXJhY3RlcnMgKHRlY2hub2xvZ2llcy90b3lzKSDDlyBIRUFSVCDDlyBhZ2UgZ3JvdXAgKDQtNnkvYWR1bHRzKSIsCiMgICAgICJmYWN0b3JfbmFtZUhfR006YWdlX2dyb3VwQ0g0Nl9BRDpjaGFyYWN0ZXJyb2JvX2NvbXAiID0gImNoYXJhY3RlcnMgKHJvYm90L2NvbXB1dGVyKSDDlyBIRUFSVCDDlyBhZ2UgZ3JvdXAgKDQtNnkvYWR1bHRzKSIsCiMgICAgICJmYWN0b3JfbmFtZUhfR006YWdlX2dyb3VwQ0g0Nl9BRDpjaGFyYWN0ZXJ0ZWRkX2RvbGwiID0gImNoYXJhY3RlcnMgKHRlZGR5IGJlYXIvZG9sbCkgw5cgSEVBUlQgw5cgYWdlIGdyb3VwICg0LTZ5L2FkdWx0cykiLAojICAgICAiZmFjdG9yX25hbWVNX0dNOmFnZV9ncm91cENINDZfQUQ6Y2hhcmFjdGVyYW5pbV9pbmFuIiA9ICJjaGFyYWN0ZXJzIChhbmltYXRlcy9pbmFuaW1hdGVzKSDDlyBNSU5EIMOXIGFnZSBncm91cCAoNC02eS9hZHVsdHMpIiwKIyAgICAgImZhY3Rvcl9uYW1lTV9HTTphZ2VfZ3JvdXBDSDQ2X0FEOmNoYXJhY3Rlcm1hbW1fbm9ubSIgPSAiY2hhcmFjdGVycyAobWFtbWFscy9vdGhlciBhbmltYWxzKSDDlyBNSU5EIMOXIGFnZSBncm91cCAoNC02eS9hZHVsdHMpIiwKIyAgICAgImZhY3Rvcl9uYW1lTV9HTTphZ2VfZ3JvdXBDSDQ2X0FEOmNoYXJhY3RlcmVsZXBfZ29tbyIgPSAiY2hhcmFjdGVycyAoZWxlcGhhbnQvb3RoZXIgbWFtbWFscykgw5cgTUlORCDDlyBhZ2UgZ3JvdXAgKDQtNnkvYWR1bHRzKSIsCiMgICAgICJmYWN0b3JfbmFtZU1fR006YWdlX2dyb3VwQ0g0Nl9BRDpjaGFyYWN0ZXJnb2F0X21vdXMiID0gImNoYXJhY3RlcnMgKGdvYXQvbW91c2UpIMOXIE1JTkQgw5cgYWdlIGdyb3VwICg0LTZ5L2FkdWx0cykiLAojICAgICAiZmFjdG9yX25hbWVNX0dNOmFnZV9ncm91cENINDZfQUQ6Y2hhcmFjdGVyYmlyZF9iZWV0IiA9ICJjaGFyYWN0ZXJzIChiaXJkL2JlZXRsZSkgw5cgTUlORCDDlyBhZ2UgZ3JvdXAgKDQtNnkvYWR1bHRzKSIsCiMgICAgICJmYWN0b3JfbmFtZU1fR006YWdlX2dyb3VwQ0g0Nl9BRDpjaGFyYWN0ZXJ0ZWNoX3RveXMiID0gImNoYXJhY3RlcnMgKHRlY2hub2xvZ2llcy90b3lzKSDDlyBNSU5EIMOXIGFnZSBncm91cCAoNC02eS9hZHVsdHMpIiwKIyAgICAgImZhY3Rvcl9uYW1lTV9HTTphZ2VfZ3JvdXBDSDQ2X0FEOmNoYXJhY3RlcnJvYm9fY29tcCIgPSAiY2hhcmFjdGVycyAocm9ib3QvY29tcHV0ZXIpIMOXIE1JTkQgw5cgYWdlIGdyb3VwICg0LTZ5L2FkdWx0cykiLAojICAgICAiZmFjdG9yX25hbWVNX0dNOmFnZV9ncm91cENINDZfQUQ6Y2hhcmFjdGVydGVkZF9kb2xsIiA9ICJjaGFyYWN0ZXJzICh0ZWRkeSBiZWFyL2RvbGwpIMOXIE1JTkQgw5cgYWdlIGdyb3VwICg0LTZ5L2FkdWx0cykiLAojICAgICAiZmFjdG9yX25hbWVIX0dNOmFnZV9ncm91cENINzlfQUQ6Y2hhcmFjdGVyYW5pbV9pbmFuIiA9ICJjaGFyYWN0ZXJzIChhbmltYXRlcy9pbmFuaW1hdGVzKSDDlyBIRUFSVCDDlyBhZ2UgZ3JvdXAgKDctOXkvYWR1bHRzKSIsCiMgICAgICJmYWN0b3JfbmFtZUhfR006YWdlX2dyb3VwQ0g3OV9BRDpjaGFyYWN0ZXJtYW1tX25vbm0iID0gImNoYXJhY3RlcnMgKG1hbW1hbHMvb3RoZXIgYW5pbWFscykgw5cgSEVBUlQgw5cgYWdlIGdyb3VwICg3LTl5L2FkdWx0cykiLAojICAgICAiZmFjdG9yX25hbWVIX0dNOmFnZV9ncm91cENINzlfQUQ6Y2hhcmFjdGVyZWxlcF9nb21vIiA9ICJjaGFyYWN0ZXJzIChlbGVwaGFudC9vdGhlciBtYW1tYWxzKSDDlyBIRUFSVCDDlyBhZ2UgZ3JvdXAgKDctOXkvYWR1bHRzKSIsCiMgICAgICJmYWN0b3JfbmFtZUhfR006YWdlX2dyb3VwQ0g3OV9BRDpjaGFyYWN0ZXJnb2F0X21vdXMiID0gImNoYXJhY3RlcnMgKGdvYXQvbW91c2UpIMOXIEhFQVJUIMOXIGFnZSBncm91cCAoNy05eS9hZHVsdHMpIiwKIyAgICAgImZhY3Rvcl9uYW1lSF9HTTphZ2VfZ3JvdXBDSDc5X0FEOmNoYXJhY3RlcmJpcmRfYmVldCIgPSAiY2hhcmFjdGVycyAoYmlyZC9iZWV0bGUpIMOXIEhFQVJUIMOXIGFnZSBncm91cCAoNy05eS9hZHVsdHMpIiwKIyAgICAgImZhY3Rvcl9uYW1lSF9HTTphZ2VfZ3JvdXBDSDc5X0FEOmNoYXJhY3RlcnRlY2hfdG95cyIgPSAiY2hhcmFjdGVycyAodGVjaG5vbG9naWVzL3RveXMpIMOXIEhFQVJUIMOXIGFnZSBncm91cCAoNy05eS9hZHVsdHMpIiwKIyAgICAgImZhY3Rvcl9uYW1lSF9HTTphZ2VfZ3JvdXBDSDc5X0FEOmNoYXJhY3RlcnJvYm9fY29tcCIgPSAiY2hhcmFjdGVycyAocm9ib3QvY29tcHV0ZXIpIMOXIEhFQVJUIMOXIGFnZSBncm91cCAoNy05eS9hZHVsdHMpIiwKIyAgICAgImZhY3Rvcl9uYW1lSF9HTTphZ2VfZ3JvdXBDSDc5X0FEOmNoYXJhY3RlcnRlZGRfZG9sbCIgPSAiY2hhcmFjdGVycyAodGVkZHkgYmVhci9kb2xsKSDDlyBIRUFSVCDDlyBhZ2UgZ3JvdXAgKDctOXkvYWR1bHRzKSIsCiMgICAgICJmYWN0b3JfbmFtZU1fR006YWdlX2dyb3VwQ0g3OV9BRDpjaGFyYWN0ZXJhbmltX2luYW4iID0gImNoYXJhY3RlcnMgKGFuaW1hdGVzL2luYW5pbWF0ZXMpIMOXIE1JTkQgw5cgYWdlIGdyb3VwICg3LTl5L2FkdWx0cykiLAojICAgICAiZmFjdG9yX25hbWVNX0dNOmFnZV9ncm91cENINzlfQUQ6Y2hhcmFjdGVybWFtbV9ub25tIiA9ICJjaGFyYWN0ZXJzIChtYW1tYWxzL290aGVyIGFuaW1hbHMpIMOXIE1JTkQgw5cgYWdlIGdyb3VwICg3LTl5L2FkdWx0cykiLAojICAgICAiZmFjdG9yX25hbWVNX0dNOmFnZV9ncm91cENINzlfQUQ6Y2hhcmFjdGVyZWxlcF9nb21vIiA9ICJjaGFyYWN0ZXJzIChlbGVwaGFudC9vdGhlciBtYW1tYWxzKSDDlyBNSU5EIMOXIGFnZSBncm91cCAoNy05eS9hZHVsdHMpIiwKIyAgICAgImZhY3Rvcl9uYW1lTV9HTTphZ2VfZ3JvdXBDSDc5X0FEOmNoYXJhY3RlcmdvYXRfbW91cyIgPSAiY2hhcmFjdGVycyAoZ29hdC9tb3VzZSkgw5cgTUlORCDDlyBhZ2UgZ3JvdXAgKDctOXkvYWR1bHRzKSIsCiMgICAgICJmYWN0b3JfbmFtZU1fR006YWdlX2dyb3VwQ0g3OV9BRDpjaGFyYWN0ZXJiaXJkX2JlZXQiID0gImNoYXJhY3RlcnMgKGJpcmQvYmVldGxlKSDDlyBNSU5EIMOXIGFnZSBncm91cCAoNy05eS9hZHVsdHMpIiwKIyAgICAgImZhY3Rvcl9uYW1lTV9HTTphZ2VfZ3JvdXBDSDc5X0FEOmNoYXJhY3RlcnRlY2hfdG95cyIgPSAiY2hhcmFjdGVycyAodGVjaG5vbG9naWVzL3RveXMpIMOXIE1JTkQgw5cgYWdlIGdyb3VwICg3LTl5L2FkdWx0cykiLAojICAgICAiZmFjdG9yX25hbWVNX0dNOmFnZV9ncm91cENINzlfQUQ6Y2hhcmFjdGVycm9ib19jb21wIiA9ICJjaGFyYWN0ZXJzIChyb2JvdC9jb21wdXRlcikgw5cgTUlORCDDlyBhZ2UgZ3JvdXAgKDctOXkvYWR1bHRzKSIsCiMgICAgICJmYWN0b3JfbmFtZU1fR006YWdlX2dyb3VwQ0g3OV9BRDpjaGFyYWN0ZXJ0ZWRkX2RvbGwiID0gImNoYXJhY3RlcnMgKHRlZGR5IGJlYXIvZG9sbCkgw5cgTUlORCDDlyBhZ2UgZ3JvdXAgKDctOXkvYWR1bHRzKSIpKSAlPiUKIyAgIGFycmFuZ2UoUGFyYW1ldGVyKSAlPiUKIyAgIG11dGF0ZShYID0gaWZlbHNlKFEyLjUgKiBROTcuNSA+IDAsICIqIiwgIiIpKSAlPiUKIyAgIG11dGF0ZV9hdCh2YXJzKC1QYXJhbWV0ZXIsIC1YKSwgCiMgICAgICAgICAgICAgZnVucyhmb3JtYXQocm91bmQoLiwgMiksIG5zbWFsbCA9IDIpKSkgJT4lCiMgICByZW5hbWUoYiA9IEVzdGltYXRlLCBFcnJvciA9IEVzdC5FcnJvciwgIiAiID0gWCkgJT4lCiMgICB1bml0ZShgOTUlIENJYCwgUTIuNSwgUTk3LjUsIHNlcCA9ICIsICIpICU+JQojICAgbXV0YXRlKGA5NSUgQ0lgID0gcGFzdGUwKCJbIiwgYDk1JSBDSWAsICJdIikpICU+JQojICAga25pdHI6OmthYmxlKGZvcm1hdCA9ICJodG1sIiwgYWxpZ24gPSBjKCJsIiwgcmVwKCJyIiwgMykpLAojICAgICAgICAgICAgICAgIGNhcHRpb24gPSAiVGFibGUgMzogRml4ZWQgZWZmZWN0cyBmcm9tIGEgbWl4ZWQtZWZmZWN0cyBCYXllc2lhbiByZWdyZXNzaW9uIG1vZGVsIHByZWRpY3RpbmcgZmFjdG9yIHNjb3JlcyBpbiBTdHVkeSAyIGJ5IGNoYXJhY3RlciwgZmFjdG9yIChCT0RZLCBIRUFSVCwgTUlORCksIGFuZCBhZ2UgZ3JvdXAuIFRoZSBtb2RlbCB1c2VkIHRoZSBmb3JtdWxhICdmYWN0b3Igc2NvcmUgfiBmYWN0b3IgKiBhZ2UgZ3JvdXAgKiBjaGFyYWN0ZXIgKyAoMSB8IHN1YmplY3QpJyBhbmQgd2FzIGltcGxlbWVudGVkIGluIHRoZSAnYnJtcycgcGFja2FnZSBmb3IgUiAoQsO8cmtuZXIsIDIwMTcpLiBGYWN0b3Igd2FzIGVmZmVjdC1jb2RlZDsgYWdlLWdyb3VwIHdhcyBkdW1teS1jb2RlZCB3aXRoIGFkdWx0cyBhcyB0aGUgYmFzZWxpbmU7IGFuZCBjaGFyYWN0ZXIgd2FzIGNvZGVkIHdpdGggZWlnaHQgb3J0aG9nb25hbCBjb250cmFzdHMgKHNlZSBtYWluIHRleHQpLiBBc3Rlcmlza3MgbWFyayBwYXJhbWV0ZXJzIHdob3NlIDk1JSBjcmVkaWJsZSBpbnRlcnZhbCBkb2VzIG5vdCBpbmNsdWRlIDAuIikgJT4lCiMgICBrYWJsZV9zdHlsaW5nKCkKYGBgCgpgYGB7ciwgcmVzdWx0cyA9ICJhc2lzIiwgaW5jbHVkZSA9IFR9CiMgIyBzdWJzZXQgb2YgbW9kZWwKIyBmaXhlZihlZmFfM19zY29yZXNfcl9kMl9hbGwpICU+JQojICAgZGF0YS5mcmFtZSgpICU+JQojICAgcm93bmFtZXNfdG9fY29sdW1uKCJQYXJhbWV0ZXIiKSAlPiUKIyAgIGZpbHRlcihQYXJhbWV0ZXIgIT0gIkludGVyY2VwdCIsCiMgICAgICAgICAgIWdyZXBsKCJjaGFyYWN0ZXJtYW1tX25vbm0iLCBQYXJhbWV0ZXIpLAojICAgICAgICAgICFncmVwbCgiY2hhcmFjdGVyZWxlcF9nb21vIiwgUGFyYW1ldGVyKSwKIyAgICAgICAgICAhZ3JlcGwoImNoYXJhY3RlcmdvYXRfbW91cyIsIFBhcmFtZXRlciksCiMgICAgICAgICAgIWdyZXBsKCJjaGFyYWN0ZXJiaXJkX2JlZXQiLCBQYXJhbWV0ZXIpLAojICAgICAgICAgICFncmVwbCgiY2hhcmFjdGVydGVjaF90b3lzIiwgUGFyYW1ldGVyKSwKIyAgICAgICAgICAhZ3JlcGwoImNoYXJhY3RlcnJvYm9fY29tcCIsIFBhcmFtZXRlciksCiMgICAgICAgICAgIWdyZXBsKCJjaGFyYWN0ZXJ0ZWRkX2RvbGwiLCBQYXJhbWV0ZXIpKSAlPiUKIyAgIG11dGF0ZShQYXJhbWV0ZXIgPSByZWNvZGVfZmFjdG9yKAojICAgICBQYXJhbWV0ZXIsCiMgICAgICMgQURVTFRTCiMgICAgICJmYWN0b3JfbmFtZUhfR00iID0gIkhFQVJUICh2cy4gZ3JhbmQgbWVhbikiLAojICAgICAiZmFjdG9yX25hbWVNX0dNIiA9ICJNSU5EICh2cy4gZ3JhbmQgbWVhbikiLAojICAgICAiY2hhcmFjdGVyYW5pbV9pbmFuIiA9ICJjaGFyYWN0ZXJzOiBhbmltYXRlcyB2cy4gaW5hbmltYXRlcyIsCiMgICAgICJmYWN0b3JfbmFtZUhfR006Y2hhcmFjdGVyYW5pbV9pbmFuIiA9ICJjaGFyYWN0ZXJzIChhbmltYXRlcy9pbmFuaW1hdGVzKSDDlyBIRUFSVCIsCiMgICAgICJmYWN0b3JfbmFtZU1fR006Y2hhcmFjdGVyYW5pbV9pbmFuIiA9ICJjaGFyYWN0ZXJzIChhbmltYXRlcy9pbmFuaW1hdGVzKSDDlyBNSU5EIiwKIyAgICAgIyBPTERFUiBDSElMRFJFTgojICAgICAiYWdlX2dyb3VwQ0g3OV9BRCIgPSAiYWdlIGdyb3VwICg3LTl5IHZzLiBhZHVsdHMpIiwKIyAgICAgImZhY3Rvcl9uYW1lSF9HTTphZ2VfZ3JvdXBDSDc5X0FEIiA9ICJIRUFSVCDDlyBhZ2UgZ3JvdXAgKDctOXkvYWR1bHRzKSIsCiMgICAgICJmYWN0b3JfbmFtZU1fR006YWdlX2dyb3VwQ0g3OV9BRCIgPSAiTUlORCDDlyBhZ2UgZ3JvdXAgKDctOXkvYWR1bHRzKSIsCiMgICAgICJhZ2VfZ3JvdXBDSDc5X0FEOmNoYXJhY3RlcmFuaW1faW5hbiIgPSAiY2hhcmFjdGVycyAoYW5pbWF0ZXMvaW5hbmltYXRlcykgw5cgYWdlIGdyb3VwICg3LTl5L2FkdWx0cykiLAojICAgICAiZmFjdG9yX25hbWVIX0dNOmFnZV9ncm91cENINzlfQUQ6Y2hhcmFjdGVyYW5pbV9pbmFuIiA9ICJjaGFyYWN0ZXJzIChhbmltYXRlcy9pbmFuaW1hdGVzKSDDlyBIRUFSVCDDlyBhZ2UgZ3JvdXAgKDctOXkvYWR1bHRzKSIsCiMgICAgICJmYWN0b3JfbmFtZU1fR006YWdlX2dyb3VwQ0g3OV9BRDpjaGFyYWN0ZXJhbmltX2luYW4iID0gImNoYXJhY3RlcnMgKGFuaW1hdGVzL2luYW5pbWF0ZXMpIMOXIE1JTkQgw5cgYWdlIGdyb3VwICg3LTl5L2FkdWx0cykiLAojICAgICAjIFlPVU5HRVIgQ0hJTERSRU4KIyAgICAgImFnZV9ncm91cENINDZfQUQiID0gImFnZSBncm91cCAoNC02eSB2cy4gYWR1bHRzKSIsCiMgICAgICJmYWN0b3JfbmFtZUhfR006YWdlX2dyb3VwQ0g0Nl9BRCIgPSAiSEVBUlQgw5cgYWdlIGdyb3VwICg0LTZ5L2FkdWx0cykiLAojICAgICAiZmFjdG9yX25hbWVNX0dNOmFnZV9ncm91cENINDZfQUQiID0gIk1JTkQgw5cgYWdlIGdyb3VwICg0LTZ5L2FkdWx0cykiLAojICAgICAiYWdlX2dyb3VwQ0g0Nl9BRDpjaGFyYWN0ZXJhbmltX2luYW4iID0gImNoYXJhY3RlcnMgKGFuaW1hdGVzL2luYW5pbWF0ZXMpIMOXIGFnZSBncm91cCAoNC02eS9hZHVsdHMpIiwKIyAgICAgImZhY3Rvcl9uYW1lSF9HTTphZ2VfZ3JvdXBDSDQ2X0FEOmNoYXJhY3RlcmFuaW1faW5hbiIgPSAiY2hhcmFjdGVycyAoYW5pbWF0ZXMvaW5hbmltYXRlcykgw5cgSEVBUlQgw5cgYWdlIGdyb3VwICg0LTZ5L2FkdWx0cykiLAojICAgICAiZmFjdG9yX25hbWVNX0dNOmFnZV9ncm91cENINDZfQUQ6Y2hhcmFjdGVyYW5pbV9pbmFuIiA9ICJjaGFyYWN0ZXJzIChhbmltYXRlcy9pbmFuaW1hdGVzKSDDlyBNSU5EIMOXIGFnZSBncm91cCAoNC02eS9hZHVsdHMpIikpICU+JQojICAgYXJyYW5nZShQYXJhbWV0ZXIpICU+JQojICAgbXV0YXRlKFggPSBpZmVsc2UoUTIuNSAqIFE5Ny41ID4gMCwgIioiLCAiIikpICU+JQojICAgbXV0YXRlX2F0KHZhcnMoLVBhcmFtZXRlciwgLVgpLAojICAgICAgICAgICAgIGZ1bnMoZm9ybWF0KHJvdW5kKC4sIDIpLCBuc21hbGwgPSAyKSkpICU+JQojICAgcmVuYW1lKGIgPSBFc3RpbWF0ZSwgRXJyb3IgPSBFc3QuRXJyb3IsICIgIiA9IFgpICU+JQojICAgdW5pdGUoYDk1JSBDSWAsIFEyLjUsIFE5Ny41LCBzZXAgPSAiLCAiKSAlPiUKIyAgIG11dGF0ZShgOTUlIENJYCA9IHBhc3RlMCgiWyIsIGA5NSUgQ0lgLCAiXSIpKSAlPiUKIyAgIGtuaXRyOjprYWJsZShmb3JtYXQgPSAiaHRtbCIsIGFsaWduID0gYygibCIsIHJlcCgiciIsIDMpKSwKIyAgICAgICAgICAgICAgICBjYXB0aW9uID0gIlRhYmxlIDM6IEEgc3Vic2V0IG9mIHRoZSBmaXhlZCBlZmZlY3RzIGZyb20gYSBtaXhlZC1lZmZlY3RzIEJheWVzaWFuIHJlZ3Jlc3Npb24gbW9kZWwgcHJlZGljdGluZyBmYWN0b3Igc2NvcmVzIGluIFN0dWR5IDIgYnkgY2hhcmFjdGVyLCBmYWN0b3IgKEJPRFksIEhFQVJULCBNSU5EKSwgYW5kIGFnZSBncm91cC4gVGhlIG1vZGVsIHVzZWQgdGhlIGZvcm11bGEgJ2ZhY3RvciBzY29yZSB+IGZhY3RvciAqIGFnZSBncm91cCAqIGNoYXJhY3RlciArICgxIHwgc3ViamVjdCknIGFuZCB3YXMgaW1wbGVtZW50ZWQgaW4gdGhlICdicm1zJyBwYWNrYWdlIGZvciBSIChCw7xya25lciwgMjAxNykuIEZhY3RvciB3YXMgZWZmZWN0LWNvZGVkOyBhZ2UtZ3JvdXAgd2FzIGR1bW15LWNvZGVkIHdpdGggYWR1bHRzIGFzIHRoZSBiYXNlbGluZTsgYW5kIGNoYXJhY3RlciB3YXMgY29kZWQgd2l0aCBlaWdodCBvcnRob2dvbmFsIGNvbnRyYXN0cyAoc2VlIG1haW4gdGV4dCkuIEhlcmUgd2UgaGF2ZSBpbmNsdWRlZCBvbmx5IGEgc3Vic2V0IG9mIHBhcmFtZXRlciBvZiBzdHJvbmcgdGhlb3JldGljYWwgaW50ZXJlc3Q7IHNlZSBTT00gZm9yIHRoZSBmdWxsIG1vZGVsLiBBc3Rlcmlza3MgbWFyayBwYXJhbWV0ZXJzIHdob3NlIDk1JSBjcmVkaWJsZSBpbnRlcnZhbCBkb2VzIG5vdCBpbmNsdWRlIDAuIikgJT4lCiMgICBrYWJsZV9zdHlsaW5nKCkgJT4lCiMgICBncm91cF9yb3dzKCJBZHVsdHMiLCAxLCA1KSAlPiUKIyAgIGdyb3VwX3Jvd3MoIk9sZGVyIGNoaWxkcmVuIHZzLiBhZHVsdHMiLCA2LCAxMSkgJT4lCiMgICBncm91cF9yb3dzKCJZb3VuZ2VyIGNoaWxkcmVuIHZzLiBhZHVsdHMiLCAxMiwgMTcpCmBgYAoKYGBge3J9CmQyX2FuaW0gPC0gZWZhXzNfc2NvcmVzX2QyX2FsbCAlPiUKICBtdXRhdGUoYW5pbV9pbmFuID0gY2FzZV93aGVuKAogICAgY2hhcmFjdGVyICVpbiUgYygiYmVldGxlIiwgImJpcmQiLCAibW91c2UiLCAiZ29hdCIsICJlbGVwaGFudCIpIH4gImFuaW1hdGUiLAogICAgY2hhcmFjdGVyICVpbiUgYygiY29tcHV0ZXIiLCAicm9ib3QiLCAiZG9sbCIsICJ0ZWRkeSBiZWFyIikgfiAiaW5hbmltYXRlIikpICU+JQogIG11dGF0ZShhbmltX2luYW4gPSBmYWN0b3IoYW5pbV9pbmFuLCBsZXZlbHMgPSBjKCJpbmFuaW1hdGUiLCAiYW5pbWF0ZSIpKSkKCmNvbnRyYXN0cyhkMl9hbmltJGFnZV9ncm91cCkgPC0gY2JpbmQoIkNINDZfQUQiID0gYygxLCAwLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0g3OV9BRCIgPSBjKDAsIDEsIDApKQpjb250cmFzdHMoZDJfYW5pbSRmYWN0b3JfbmFtZSkgPC0gY2JpbmQoIkhfR00iID0gYygtMSwgMSwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTV9HTSIgPSBjKC0xLCAwLCAxKSkKY29udHJhc3RzKGQyX2FuaW0kYW5pbV9pbmFuKSA8LSBjYmluZCgiYW5pbV9HTSIgPSBjKC0xLCAxKSkKCiMgZDJfYW5pbV9yIDwtIGJybShzY29yZSB+IGZhY3Rvcl9uYW1lICogYW5pbV9pbmFuICogYWdlX2dyb3VwICsgCiMgICAgICAgICAgICAgICAoMSB8IHN1YmlkKSArCiMgICAgICAgICAgICAgICAoMSArIGZhY3Rvcl9uYW1lICsgYWdlX2dyb3VwIHwgY2hhcmFjdGVyKSwKIyAgICAgICAgICAgICBkYXRhID0gZDJfYW5pbSwKIyAgICAgICAgICAgICBjb250cm9sID0gbGlzdChhZGFwdF9kZWx0YSA9IDAuOTkpLAojICAgICAgICAgICAgIGNvcmVzID0gNCkKIyBzYXZlUkRTKGQyX2FuaW1fciwgZmlsZSA9ICIuL2JybXNfbW9kZWxzL2QyX2FuaW1fci5yZHMiKQoKZDJfYW5pbV9yIDwtIHJlYWRSRFMoIi4vYnJtc19tb2RlbHMvZDJfYW5pbV9yLnJkcyIpCiMgc3VtbWFyWShkMl9hbmltX3IpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBULCByZXN1bHRzID0gImFzaXMifQpmaXhlZihkMl9hbmltX3IpICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oIlBhcmFtZXRlciIpICU+JQogIG11dGF0ZShQYXJhbWV0ZXIgPSByZWNvZGVfZmFjdG9yKAogICAgUGFyYW1ldGVyLAogICAgIyBBRFVMVFMKICAgICJJbnRlcmNlcHQiID0gIihJbnRlcmNlcHQpIiwKICAgICJmYWN0b3JfbmFtZUhfR00iID0gIkhFQVJUICh2cy4gZ3JhbmQgbWVhbikiLAogICAgImZhY3Rvcl9uYW1lTV9HTSIgPSAiTUlORCAodnMuIGdyYW5kIG1lYW4pIiwKICAgICJhbmltX2luYW5hbmltX0dNIiA9ICJjaGFyYWN0ZXJzOiBhbmltYXRlcyB2cy4gaW5hbmltYXRlcyIsCiAgICAiZmFjdG9yX25hbWVIX0dNOmFuaW1faW5hbmFuaW1fR00iID0gImNoYXJhY3RlcnMgKGFuaW1hdGVzL2luYW5pbWF0ZXMpIMOXIEhFQVJUIiwKICAgICJmYWN0b3JfbmFtZU1fR006YW5pbV9pbmFuYW5pbV9HTSIgPSAiY2hhcmFjdGVycyAoYW5pbWF0ZXMvaW5hbmltYXRlcykgw5cgTUlORCIsCiAgICAjIE9MREVSIENISUxEUkVOCiAgICAiYWdlX2dyb3VwQ0g3OV9BRCIgPSAiYWdlIGdyb3VwICg3LTl5IHZzLiBhZHVsdHMpIiwKICAgICJmYWN0b3JfbmFtZUhfR006YWdlX2dyb3VwQ0g3OV9BRCIgPSAiSEVBUlQgw5cgYWdlIGdyb3VwICg3LTl5L2FkdWx0cykiLAogICAgImZhY3Rvcl9uYW1lTV9HTTphZ2VfZ3JvdXBDSDc5X0FEIiA9ICJNSU5EIMOXIGFnZSBncm91cCAoNy05eS9hZHVsdHMpIiwKICAgICJhbmltX2luYW5hbmltX0dNOmFnZV9ncm91cENINzlfQUQiID0gImNoYXJhY3RlcnMgKGFuaW1hdGVzL2luYW5pbWF0ZXMpIMOXIGFnZSBncm91cCAoNy05eS9hZHVsdHMpIiwKICAgICJmYWN0b3JfbmFtZUhfR006YW5pbV9pbmFuYW5pbV9HTTphZ2VfZ3JvdXBDSDc5X0FEIiA9ICJjaGFyYWN0ZXJzIChhbmltYXRlcy9pbmFuaW1hdGVzKSDDlyBIRUFSVCDDlyBhZ2UgZ3JvdXAgKDctOXkvYWR1bHRzKSIsCiAgICAiZmFjdG9yX25hbWVNX0dNOmFuaW1faW5hbmFuaW1fR006YWdlX2dyb3VwQ0g3OV9BRCIgPSAiY2hhcmFjdGVycyAoYW5pbWF0ZXMvaW5hbmltYXRlcykgw5cgTUlORCDDlyBhZ2UgZ3JvdXAgKDctOXkvYWR1bHRzKSIsCiAgICAjIFlPVU5HRVIgQ0hJTERSRU4KICAgICJhZ2VfZ3JvdXBDSDQ2X0FEIiA9ICJhZ2UgZ3JvdXAgKDQtNnkgdnMuIGFkdWx0cykiLAogICAgImZhY3Rvcl9uYW1lSF9HTTphZ2VfZ3JvdXBDSDQ2X0FEIiA9ICJIRUFSVCDDlyBhZ2UgZ3JvdXAgKDQtNnkvYWR1bHRzKSIsCiAgICAiZmFjdG9yX25hbWVNX0dNOmFnZV9ncm91cENINDZfQUQiID0gIk1JTkQgw5cgYWdlIGdyb3VwICg0LTZ5L2FkdWx0cykiLAogICAgImFuaW1faW5hbmFuaW1fR006YWdlX2dyb3VwQ0g0Nl9BRCIgPSAiY2hhcmFjdGVycyAoYW5pbWF0ZXMvaW5hbmltYXRlcykgw5cgYWdlIGdyb3VwICg0LTZ5L2FkdWx0cykiLAogICAgImZhY3Rvcl9uYW1lSF9HTTphbmltX2luYW5hbmltX0dNOmFnZV9ncm91cENINDZfQUQiID0gImNoYXJhY3RlcnMgKGFuaW1hdGVzL2luYW5pbWF0ZXMpIMOXIEhFQVJUIMOXIGFnZSBncm91cCAoNC02eS9hZHVsdHMpIiwKICAgICJmYWN0b3JfbmFtZU1fR006YW5pbV9pbmFuYW5pbV9HTTphZ2VfZ3JvdXBDSDQ2X0FEIiA9ICJjaGFyYWN0ZXJzIChhbmltYXRlcy9pbmFuaW1hdGVzKSDDlyBNSU5EIMOXIGFnZSBncm91cCAoNC02eS9hZHVsdHMpIikpICU+JQogIGFycmFuZ2UoUGFyYW1ldGVyKSAlPiUKICBtdXRhdGUoWCA9IGlmZWxzZShRMi41ICogUTk3LjUgPiAwLCAiKiIsICIiKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoLVBhcmFtZXRlciwgLVgpLAogICAgICAgICAgICBmdW5zKGZvcm1hdChyb3VuZCguLCAyKSwgbnNtYWxsID0gMikpKSAlPiUKICByZW5hbWUoYiA9IEVzdGltYXRlLCBFcnJvciA9IEVzdC5FcnJvciwgIiAiID0gWCkgJT4lCiAgdW5pdGUoYDk1JSBDSWAsIFEyLjUsIFE5Ny41LCBzZXAgPSAiLCAiKSAlPiUKICBtdXRhdGUoYDk1JSBDSWAgPSBwYXN0ZTAoIlsiLCBgOTUlIENJYCwgIl0iKSkgJT4lCiAga25pdHI6OmthYmxlKGZvcm1hdCA9ICJodG1sIiwgYWxpZ24gPSBjKCJsIiwgcmVwKCJyIiwgMykpLAogICAgICAgICAgICAgICBjYXB0aW9uID0gIlRhYmxlIDM6IEZpeGVkIGVmZmVjdHMgZnJvbSBhIG1peGVkLWVmZmVjdHMgQmF5ZXNpYW4gcmVncmVzc2lvbiBtb2RlbCBwcmVkaWN0aW5nIGZhY3RvciBzY29yZXMgaW4gU3R1ZHkgMiBieSBhbmltYWN5IHN0YXR1cyAoYW5pbWF0ZXMsIGluYW5pbWF0ZXMpLCBmYWN0b3IgKEJPRFksIEhFQVJULCBNSU5EKSwgYW5kIGFnZSBncm91cCAoNC02eSwgNy05eSwgYWR1bHRzKS4gVGhlIG1vZGVsIHVzZWQgdGhlIGZvcm11bGEgJ2ZhY3RvciBzY29yZSB+IGZhY3RvciAqIGFnZSBncm91cCAqIGFuaW1hY3kgKyAoMSB8IHN1YmplY3QpICsgKDEgKyBmYWN0b3IgKyBhZ2UgZ3JvdXAgfCBjaGFyYWN0ZXIpJyBhbmQgd2FzIGltcGxlbWVudGVkIGluIHRoZSAnYnJtcycgcGFja2FnZSBmb3IgUiAoQsO8cmtuZXIsIDIwMTcpLiBBbmltYWN5IHN0YXR1cyBhbmQgZmFjdG9yIHdlcmUgZWZmZWN0LWNvZGVkOyBhZ2UtZ3JvdXAgd2FzIGR1bW15LWNvZGVkIHdpdGggYWR1bHRzIGFzIHRoZSBiYXNlbGluZS4gQXN0ZXJpc2tzIG1hcmsgcGFyYW1ldGVycyB3aG9zZSA5NSUgY3JlZGlibGUgaW50ZXJ2YWwgZG9lcyBub3QgaW5jbHVkZSAwLiIpICU+JQogIGthYmxlX3N0eWxpbmcoKSAlPiUKICBncm91cF9yb3dzKCJBZHVsdHMiLCAxLCA2KSAlPiUKICBncm91cF9yb3dzKCI3LTl5IHZzLiBhZHVsdHMiLCA3LCAxMikgJT4lCiAgZ3JvdXBfcm93cygiNC02eSB2cy4gYWR1bHRzIiwgMTMsIDE4KQpgYGAKCkJ5IGRlZmluaXRpb24sIGFkdWx0cycgZmFjdG9yIHNjb3JlcyBkaWQgbm90IGRpZmZlciBhY3Jvc3MgZmFjdG9ycyAoSEVBUlQgdnMuIGdyYW5kIG1lYW46IGByIHdyaXRlX2JfOTVDSV9mdW4oZDJfYW5pbV9yLCAiZmFjdG9yX25hbWVIX0dNIilgOyBNSU5EIHZzLiBncmFuZCBtZWFuOiBgciB3cml0ZV9iXzk1Q0lfZnVuKGQyX2FuaW1fciwgImZhY3Rvcl9uYW1lTV9HTSIpYCkuIEFzIHdlIHdvdWxkIGV4cGVjdCwgYWR1bHRzIGF0dHJpYnV0ZWQgbW9yZSBtZW50YWwgY2FwYWNpdGllcyAoY29sbGFwc2luZyBhY3Jvc3MgZmFjdG9ycykgdG8gYW5pbWF0ZXMgdGhhbiBpbmFuaW1hdGVzIChgciB3cml0ZV9iXzk1Q0lfZnVuKGQyX2FuaW1fciwgImFuaW1faW5hbmFuaW1fR00iKWAp4oCUYSBkaWZmZXJlbmNlIHRoYXQgd2FzIGRpbWluaXNoZWQgaW4gdGhlIF9IRUFSVF8gZG9tYWluIChgciB3cml0ZV9iXzk1Q0lfZnVuKGQyX2FuaW1fciwgImZhY3Rvcl9uYW1lSF9HTTphbmltX2luYW5hbmltX0dNIilgKSwgYnV0IG5vdCBzdWJzdGFudGlhbGx5IGRpbWluaXNoZWQgaW4gdGhlIF9NSU5EXyBkb21haW4gKGByIHdyaXRlX2JfOTVDSV9mdW4oZDJfYW5pbV9yLCAiZmFjdG9yX25hbWVNX0dNOmFuaW1faW5hbmFuaW1fR00iKWApLgoKQXMgYSBncm91cCwgNy0gdG8gOS15ZWFyLW9sZCBjaGlsZHJlbidzIG1lbnRhbCBjYXBhY2l0eSBhdHRyaWJ1dGlvbnMgZGlkIG5vdCBkaWZmZXIgZnJvbSBhZHVsdHMsIGNvbGxhcHNpbmcgY29sbGFwc2luZyBhY3Jvc3MgZmFjdG9ycyBhbmQgY2hhcmFjdGVycyAoYHIgd3JpdGVfYl85NUNJX2Z1bihkMl9hbmltX3IsICJhZ2VfZ3JvdXBDSDc5X0FEIilgKeKAlGJ1dCB0aGlzIG1hc2tzIHNldmVyYWwgaW1wb3J0YW50IGRpZmZlcmVuY2VzIGJldHdlZW4gb2xkZXIgY2hpbGRyZW4gYW5kIGFkdWx0cy4gQXMgaW4gU3R1ZHkgMSwgb2xkZXIgY2hpbGRyZW4ncyBzY29yZXMgd2VyZSBjaGFyYWN0ZXJpemVkIGJ5IGEgcmVsYXRpdmUgb3Zlci1hdHRyaWJ1dGlvbiBvZiBhYmlsaXRpZXMgaW4gdGhlIF9IRUFSVF8gZG9tYWluIChgciB3cml0ZV9iXzk1Q0lfZnVuKGQyX2FuaW1fciwgImZhY3Rvcl9uYW1lSF9HTTphZ2VfZ3JvdXBDSDc5X0FEIilgKSwgYW5kIGEgcmVsYXRpdmUgdW5kZXItYXR0cmlidXRpb24gb2YgYWJpbGl0aWVzIGluIHRoZSBfTUlORF8gZG9tYWluIChgciB3cml0ZV9iXzk1Q0lfZnVuKGQyX2FuaW1fciwgImZhY3Rvcl9uYW1lTV9HTTphZ2VfZ3JvdXBDSDc5X0FEIilgKS4gQ29sbGFwc2luZyBhY3Jvc3MgZmFjdG9ycywgb2xkZXIgY2hpbGRyZW4gbWFkZSBsZXNzIG9mIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBhbmltYXRlIGFuIGluYW5pbWF0ZSB0YXJnZXQgY2hhcmFjdGVycywgcmVsYXRpdmUgdG8gYWR1bHRzIChgciB3cml0ZV9iXzk1Q0lfZnVuKGQyX2FuaW1fciwgImFuaW1faW5hbmFuaW1fR006YWdlX2dyb3VwQ0g3OV9BRCIpYCkuIFRoaXMgcmVsYXRpdmUgdW5kZXItZGlmZmVyZW50aWF0aW9uIG9mIGFuaW1hdGUgYW5kIGluYW5pbWF0ZSBjaGFyYWN0ZXJzIHdhcyBwYXJ0aWN1bGFybHkgcHJvbm91bmNlZCBpbiB0aGUgX01JTkRfIGRvbWFpbiAoYHIgd3JpdGVfYl85NUNJX2Z1bihkMl9hbmltX3IsICJmYWN0b3JfbmFtZU1fR006YW5pbV9pbmFuYW5pbV9HTTphZ2VfZ3JvdXBDSDc5X0FEIilgKS4KCkhvdyBkaWQgeW91bmdlciBjaGlsZHJlbiBjb21wYXJlIHRvIGFkdWx0cz8gQXMgYSBncm91cCwgNC0gdG8gNi15ZWFyLW9sZCBjaGlsZHJlbidzIG1lbnRhbCBjYXBhY2l0eSBhdHRyaWJ1dGlvbnMgZGlkIG5vdCBkaWZmZXIgZnJvbSBhZHVsdHMsIGNvbGxhcHNpbmcgY29sbGFwc2luZyBhY3Jvc3MgZmFjdG9ycyBhbmQgY2hhcmFjdGVycyAoYHIgd3JpdGVfYl85NUNJX2Z1bihkMl9hbmltX3IsICJhZ2VfZ3JvdXBDSDQ2X0FEIilgKeKAlGJ1dCBhZ2FpbiwgdGhpcyBtYXNrcyBhIHZhcmlldHkgb2YgZGV2ZWxvcG1lbnRhbCBkaWZmZXJlbmNlcyB0aGF0IGdlbmVyYWxseSBwYXJhbGxlbCB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBvbGRlciBjaGlsZHJlbiBhbmQgYWR1bHRzIGp1c3QgZGVzY3JpYmVkLiBNdWNoIGxpa2Ugb2xkZXIgY2hpbGRyZW4sIHlvdW5nZXIgY2hpbGRyZW4ncyBzY29yZXMgd2VyZSBjaGFyYWN0ZXJpemVkIGJ5IGEgcmVsYXRpdmUgb3Zlci1hdHRyaWJ1dGlvbiBvZiBhYmlsaXRpZXMgaW4gdGhlIF9IRUFSVF8gZG9tYWluIChgciB3cml0ZV9iXzk1Q0lfZnVuKGQyX2FuaW1fciwgImZhY3Rvcl9uYW1lSF9HTTphZ2VfZ3JvdXBDSDQ2X0FEIilgKSBhbmQgYSByZWxhdGl2ZSB1bmRlci1hdHRyaWJ1dGlvbiBvZiBhYmlsaXRpZXMgaW4gdGhlIF9NSU5EXyBkb21haW4gKGByIHdyaXRlX2JfOTVDSV9mdW4oZDJfYW5pbV9yLCAiZmFjdG9yX25hbWVNX0dNOmFnZV9ncm91cENINDZfQUQiKWApLCBhbmQgdGhleSBkaWZmZXJlbnRpYXRlZCBsZXNzIGJldHdlZW4gYW5pbWF0ZSBhbiBpbmFuaW1hdGUgdGFyZ2V0IGNoYXJhY3RlcnMgdGhhbiBkaWQgYWR1bHRzIChgciB3cml0ZV9iXzk1Q0lfZnVuKGQyX2FuaW1fciwgImFuaW1faW5hbmFuaW1fR006YWdlX2dyb3VwQ0g0Nl9BRCIpYCkuIFRoaXMgcmVsYXRpdmUgdW5kZXItZGlmZmVyZW50aWF0aW9uIG9mIGFuaW1hdGUgYW5kIGluYW5pbWF0ZSBjaGFyYWN0ZXJzIHdhcyBwYXJ0aWN1bGFybHkgcHJvbm91bmNlZCBpbiB0aGUgX01JTkRfIGRvbWFpbiAoYHIgd3JpdGVfYl85NUNJX2Z1bihkMl9hbmltX3IsICJmYWN0b3JfbmFtZU1fR006YW5pbV9pbmFuYW5pbV9HTTphZ2VfZ3JvdXBDSDQ2X0FEIilgKSwgYW5kIGxlc3MgcHJvbm91bmNlZCBpbiB0aGUgX0hFQVJUXyBkb21haW4gKGByIHdyaXRlX2JfOTVDSV9mdW4oZDJfYW5pbV9yLCAiZmFjdG9yX25hbWVIX0dNOmFuaW1faW5hbmFuaW1fR006YWdlX2dyb3VwQ0g0Nl9BRCIpYCkuCgpgYGB7cn0KZmlnMDZhX3Bsb3QgPC0gZDJfYW5pbSAlPiUKICBncm91cF9ieShhZ2VfZ3JvdXAsIGZhY3Rvcl9uYW1lLCBhbmltX2luYW4pICU+JQogIG11bHRpX2Jvb3Rfc3RhbmRhcmQoY29sID0gInNjb3JlIikgJT4lCiAgdW5ncm91cCgpICU+JQogIGZpbHRlcighaXMubmEoYW5pbV9pbmFuKSkgJT4lCiAgbXV0YXRlKGFnZV9ncm91cCA9IHJlY29kZV9mYWN0b3IoYWdlX2dyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGlsZHJlbjQ2IiA9ICI0LTZ5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hpbGRyZW43OSIgPSAiNy05eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkdWx0cyIgPSAiYWR1bHRzIiksCiAgICAgICAgIGFuaW1faW5hbiA9IHJlY29kZV9mYWN0b3IoYW5pbV9pbmFuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmFuaW1hdGUiID0gImluYW5pbWF0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmltYXRlIiA9ICJhbmltYXRlcyIpLAogICAgICAgICBmYWNldF9sYWIgPSAiYW5pbWF0ZXMgdnMuIGluYW5pbWF0ZXMiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBhZ2VfZ3JvdXAsIGdyb3VwID0gYW5pbV9pbmFuLAogICAgICAgICAgICAgeSA9IG1lYW4sIGNvbG9yID0gYW5pbV9pbmFuKSkgKyAKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGZhY3Rvcl9uYW1lKSwgY29scyA9IHZhcnMoZmFjZXRfbGFiKSwgc2NhbGVzID0gImZyZWUiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbHR5ID0gMikgKwogIGdlb21fbGluZShwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSkgKwogIGdlb21fcG9pbnRyYW5nZShhZXMoeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLAogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJzbGF0ZWdyZXkiLCAiZmlyZWJyaWNrMSIpLCBuYS52YWx1ZSA9ICJncmF5IikgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoLTEwLCAxMCwgMSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQobnJvdyA9IDIsIHJldmVyc2UgPSBUKSkgKwogIGxhYnMoeCA9ICJhZ2UgZ3JvdXAiLCB5ID0gImZhY3RvciBzY29yZSIsIGNvbG9yID0gImFuaW1hY3kiKQpgYGAKCmBgYHtyfQpmaWcwNmJfcGxvdCA8LSBnZ3Bsb3QoZWZhXzNfc2NvcmVzX2Jvb3RfZDJfYWxsICU+JQogICAgICAgICAgICAgICAgICAgICAgICBsZWZ0X2pvaW4oZDJfYWxsX2NoYXIgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShjaGFyYWN0ZXIgPSBnc3ViKCJfIiwgIiAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIpKSkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShhZ2VfZ3JvdXAgPSByZWNvZGVfZmFjdG9yKGFnZV9ncm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoaWxkcmVuNDYiID0gIjQtNnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hpbGRyZW43OSIgPSAiNy05eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZHVsdHMiID0gImFkdWx0cyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gZmFjdG9yKGNoYXJhY3RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJjb21wdXRlciIsICJyb2JvdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZG9sbCIsICJ0ZWRkeSBiZWFyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWV0bGUiLCAiYmlyZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW91c2UiLCAiZ29hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZWxlcGhhbnQiKSkpLAogICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBhZ2VfZ3JvdXAsIHkgPSBtZWFuLCBjb2xvciA9IGNoYXJhY3RlcikpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGZhY3Rvcl9uYW1lKSwgY29scyA9IHZhcnMoY2hhcmFjdGVyKSwgc2NhbGVzID0gImZyZWUiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbHR5ID0gMikgKwogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBjaGFyYWN0ZXIpKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlcikpICsKICAgICAgICAgICAgICAgICAgIyBmYXR0ZW4gPSAzLCBzaGFwZSA9IDIxLCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX2xhYmVsKGFlcyhsYWJlbCA9IHBhc3RlMCgiKG49IiwgbiwgIikiKSwgeSA9IGNpX2xvd2VyKSwgCiAgICAgICAgICAgICBsYWJlbC5zaXplID0gMCwgYWxwaGEgPSAwLjgsIAogICAgICAgICAgICAgbnVkZ2VfeSA9IC0wLjUsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0xMCwgMTAsIDEpKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiUGFpcmVkIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGFscGhhID0gMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3cgPSAyLCBieXJvdyA9IFQsIHJldmVyc2UgPSBUKSkgKwogIGxhYnMoeCA9ICJhZ2UgZ3JvdXAiLCB5ID0gIiIsIGNvbG9yID0gImNoYXJhY3RlciIpCmBgYAoKYGBge3J9CmZpZzA2X3Bsb3RzIDwtIHBsb3RfZ3JpZChmaWcwNmFfcGxvdCwgZmlnMDZiX3Bsb3QsCiAgICAgICAgICAgICAgICAgICAgICAgICBucm93ID0gMSwgcmVsX3dpZHRocyA9IGMoMC4xNSwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSAiQVVUTyIpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBULCBmaWcud2lkdGggPSA5LCBmaWcuYXNwID0gMC41fQpmaWcwNl93aXRoX2NhcHRpb24gPC0gYWRkX3N1YihmaWcwNl9wbG90cywgc3RyX3dyYXAoIkZpZ3VyZSA2OiBGYWN0b3Igc2NvcmVzIGZvciB5b3VuZ2VyIGNoaWxkcmVuICg0LTZ5KSwgb2xkZXIgY2hpbGRyZW4gKDctOXkpLCBhbmQgYWR1bHRzIGluIFN0dWR5IDIsIGluIHdoaWNoIGVhY2ggcGFydGljaXBhbnQgYXNzZXNzZWQgMjAgbWVudGFsIGNhcGFjaXRpZXMgZm9yIG9uZSBvZiBuaW5lIHRhcmdldCBjaGFyYWN0ZXJzLiBFYWNoIHBhcnRpY2lwYW50IHJlY2lldmVkIGEgZmFjdG9yIHNjb3JlIGZvciBlYWNoIGZhY3RvciAoQk9EWSwgSEVBUlQsIGFuZCBNSU5ELCBhcyBkZWZpbmVkIGJ5IGFuIGV4cGxvcmF0b3J5IGZhY3RvciBhbmFseXNpcyBvZiBhZHVsdHMnIHJlc3BvbnNlcykuIFdlIHRyZWF0ZWQgdGhlc2Ugc2NvcmVzIGFzIHN1bW1hcmllcyBvZiB0aGF0IHBhcnRpY2lwYW50cycgbWVudGFsIGNhcGFjaXR5IGF0dHJpYnV0aW9ucyBpbiB0aGVzZSBkb21haW5zOyBhIHNjb3JlIG9mIDAgY29ycmVzcG9uZHMgdG8gdGhlIG1lYW4gZm9yIHRoYXQgZmFjdG9yIGFtb25nIGFkdWx0cy4gV2UgcHJlc2VudCB0d28gd2F5cyBvZiBsb29raW5nIGF0IHRoZXNlIGRhdGE6IGNvbGxhcHNpbmcgY2hhcmFjdGVycyBpbnRvIGFuaW1hdGVzIChiZWV0bGUsIGJpcmQsIG1vdXNlLCBnb2F0LCBlbGVwaGFudCkgdnMuIGluYW5pbWF0ZXMgKGNvbXB1dGVyLCByb2JvdCwgZG9sbCwgdGVkZHkgYmVhcjsgUGFuZWwgQSk7IGFuZCBleGFtaW5pbmcgZWFjaCBjaGFyYWN0ZXIgaW5kaXZpZHVhbGx5IChQYW5lbCBCKS4gRXJyb3IgYmFycyBhcmUgYm9vdHN0cmFwcGVkIDk1JSBjb25maWRlbmNlIGludGVydmFscy4gTm90ZSB0aGF0IHRoZSByYW5nZSBvZiB0aGUgeS1heGlzIGRpZmZlcnMgYWNyb3NzIHJvd3MuIiwgMjEwKSwgeCA9IDAsIGhqdXN0ID0gMCkKZ2dkcmF3KGZpZzA2X3dpdGhfY2FwdGlvbikKYGBgCgpBIHZpc3VhbCBpbnNwZWN0aW9uIG9mIEZpZ3VyZSA2IGZ1cnRoZXIgY2xhcmlmaWVzIHRoZXNlIGZpbmRpbmdzLiAKCkluIHRoZSBfQk9EWV8gZG9tYWluLCBhIGRpc3RpbmN0aW9uIGJldHdlZW4gYW5pbWF0ZSBhbmQgaW5hbmltYXRlIHRhcmdldCBjaGFyYWN0ZXJzIHdhcyBjbGVhcmx5IHByZXNlbnQgaW4gYWxsIGFnZSBncm91cHMsIHRob3VnaCBzbGlnaHRseSBhdHRlbnVhdGVkIGFtb25nIDQtIHRvIDYteWVhci1vbGQgY2hpbGRyZW4gKHNlZSBGaWd1cmUgNiwgUGFuZWwgQSwgdG9wIHJvdykuIEEgY2xvc2VyIGxvb2sgYXQgZmFjdG9yIHNjb3JlcyBmb3IgaW5kaXZpZHVhbCBjaGFyYWN0ZXJzIChQYW5lbCBCLCB0b3Agcm93KSBzdWdnZXN0cyB0aGF0IHlvdW5nZXIgY2hpbGRyZW4gZGl2ZXJnZWQgZnJvbSBhZHVsdHMgcHJpbWFyaWx5IGluIHRoZWlyIGF0dHJpYnV0aW9ucyB0byB0aGUgImVkZ2UgY2FzZXMiIHRoYXQgd2VyZSB0aGUgZm9jdXMgb2YgU3R1ZHkgMTogdGhlIHJvYm90ICh0byB3aGljaCB0aGV5IG92ZXItYXR0cmlidXRlZCB0aGUgcGh5c2lvbG9naWNhbCBzZW5zYXRpb25zIHJlbGF0ZWQgdG8gdGhlIF9CT0RZXyksIGFuZCB0aGUgYmVldGxlICh0byB3aGljaCB0aGV5IHVuZGVyLWF0dHJpYnV0ZWQgc3VjaCBfQk9EWV8gY2FwYWNpdGllcykuIE9sZGVyIGNoaWxkcmVuJ3MgX0JPRFlfIGF0dHJpYnV0aW9ucyB3ZXJlIGdlbmVyYWxseSBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGFkdWx0cycgZm9yIGFsbW9zdCBhbGwgdGFyZ2V0IGNoYXJhY3RlcnMuIChUaGUgb25seSBwb3NzaWJsZSBleGNlcHRpb24gaXMgdGhlIGJpcmTigJRidXQsIGluIG91ciB2aWV3LCBpdCBhcHBlYXJzIHRoYXQgdGhpcyB3YXMgZHJpdmVuIGJ5IF9hZHVsdHNfIHNsaWdodGx5IF91bmRlcl8tYXR0cmlidXRpbmcgX0JPRFlfIGNhcGFjaXRpZXMgdG8gdGhpcyBjaGFyYWN0ZXIuKQoKSW4gdGhlIF9IRUFSVF8gZG9tYWluLCB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBhbmltYXRlIGFuZCBpbmFuaW1hdGUgdGFyZ2V0IGNoYXJhY3RlcnMgd2FzIHN1YnRsZXIgYWNyb3NzIGFsbCBhZ2UgZ3JvdXBzLCBhbmQgdGhlIGRlZ3JlZSBvZiBkaXN0aW5jdGlvbiBkaWQgbm90IHZhcnkgZHJhbWF0aWNhbGx5IHdpdGggYWdlIChzZWUgRmlndXJlIDYsIFBhbmVsIEEsIG1pZGRsZSByb3cpLiBJbnN0ZWFkLCBjaGlsZHJlbiBnZW5lcmFsbHkgb3Zlci1hdHRyaWJ1dGVkIF9IRUFSVF8gdG8gX2JvdGhfIGFuaW1hdGVzIGFuZCBpbmFuaW1hdGVzOyB0aGVzZSBvdmVyLWF0dHJpYnV0aW9ucyBkZWNsaW5lZCBiZXR3ZWVuIDQtNnkgYW5kIDctOXkgb2YgYWdlLCBidXQgZGlkIG5vdCByZWFjaCBhZHVsdC1saWtlIGxldmVscyBldmVuIGFtb25nIG9sZGVyIGNoaWxkcmVuLiBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCBTdHVkeSAxLCBpbiB3aGljaCA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuIG92ZXItYXR0cmlidXRlZCBfSEVBUlRfIHRvIGJvdGggdGhlIGJlZXRsZSBhbmQgdGhlIHJvYm90LCByZWxhdGl2ZSB0byBhZHVsdHMuIEluIHRoaXMgc3R1ZHksIG9sZGVyIGNoaWxkcmVuIGFnYWluIGF0dHJpYnV0ZWQgbW9yZSBfSEVBUlRfIGNhcGFjaXRpZXMgdG8gdGhlIGJlZXRsZSBhbmQgdGhlIHJvYm90LCBidXQgYWxzbyB0byB0aGUgbW91c2UgYW5kIHRoZSBnb2F0IChzZWUgUGFuZWwgQiwgbWlkZGxlIHJvdykuIFJlbGF0aXZlIHRvIG90aGVyIGFuaW1hdGVzLCBhZHVsdHMgYXR0cmlidXRlZCBwYXJ0aWN1bGFybHkgZmV3IF9IRUFSVF8gY2FwYWNpdGllcyB0byB0aGUgbW91c2UgYW5kIHRoZSBnb2F04oCUcGVyaGFwcyBiZWNhdXNlIG9mIHRoZWlyIHJlc3BlY2l2ZSBzdGF0dXNlcyBhcyB2ZXJtaW4gYW5kIGZvb2QgYW5pbWFscyBpbiB0aGlzIGN1bHR1cmFsIGNvbnRleHQuCgpGaW5hbGx5LCBpbiB0aGUgX01JTkRfIGRvbWFpbiwgbmVpdGhlciBncm91cCBvZiBjaGlsZHJlbiBtYWRlIGEgcm9idXN0IGRpc3RpbmN0aW9uIGJldHdlZW4gYW5pbWF0ZXMgYW5kIGluYW1hdGVz4oCUYnV0IGFkdWx0cyBjbGVhcmx5IGRpZCAoc2VlIEZpZ3VyZSA2LCBQYW5lbCBBLCBib3R0b20gcm93KS4gSW5zdGVhZCwgY2hpbGRyZW4gZ2VuZXJhbGx5IHVuZGVyLWF0dHJpYnV0ZWQgX01JTkRfIHRvIF9ib3RoXyBhbmltYXRlcyBhbmQgaW5hbmltYXRlcy4gVGhlc2UgdW5kZXItYXR0cmlidXRpb25zIGJlY2FtZSBsZXNzIGRyYW1hdGljIGJldHdlZW4gNC02eSBhbmQgNy05eSBvZiBhZ2UsIGFuZCBieSA3LTl5IGNoaWxkcmVuJ3MgX01JTkRfIGF0dHJpYnV0aW9ucyB0byBpbmFuaW1hdGVzIHdlcmUgYWR1bHQtbGlrZS4gQnV0IGV2ZW4gYXQgNy05eSwgY2hpbGRyZW4gZGlkIG5vdCBhdHRyaWJ1dGVkIGFzIG1hbnkgX01JTkRfIGNhcGFjaXRpZXMgdG8gYW5pbWF0ZXMgYXMgZGlkIGFkdWx0czsgYmV0d2VlbiA3LTl5IGFuZCBhZHVsdGhvb2QsIF9NSU5EXyBhdHRyaWJ1dGlvbnMgaW5jcmVhc2VkIGZvciBhbGwgb2YgdGhlIGFuaW1hdGUgY2hhcmFjdGVycywgYW5kIHBhcnRpY3VsYXJseSBkcmFtYXRpY2FsbHkgZm9yIHRoZSBiaXJkLCB0aGUgbW91c2UsIGFuZCB0aGUgZWxlcGhhbnQgKHNlZSBGaWd1cmUgNiwgUGFuZWwgQiwgYm90dG9tIHJvdykuCgpUaGUgcmF3IGRhdGEgZnVydGhlciBzdXBwb3JzdCB0aGVzZSBvYnNlcnZhdGlvbnM7IHNlZSBGaWd1cmUgNyBmb3IgcmF3IGNvdW50cyBvZiBfbm9fLCBfa2luZGFfLCBhbmQgX3llc18gcmVzcG9uc2VzIGZvciBhbGwgaXRlbXMsIGdyb3VwZWQgYnkgZmFjdG9yLCBhbmltYWN5IHN0YXR1cyAoUGFuZWxzIEEtQykgb3IgY2hhcmFjdGVyIChQYW5lbHMgRC1GKSwgYW5kIGFnZSBncm91cC4gRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHBhaW4gKHRoZSBmaXJzdCBjYXBhY2l0eSB1bmRlciBfQk9EWV8pOiBBY3Jvc3MgYWdlIGdyb3VwcywgbW9zdCBwYXJ0aWNpcGFudHMgc2FpZCB0aGF0IGFuIGVsZXBoYW50IGNvdWxkIGZlZWwgcGFpbiwgd2l0aCB0aGUgcHJvcG9ydGlvbiBvZiAieWVzIiByZXNwb25zZXMgaW5jcmVhc2luZyBhY3Jvc3MgYWdlIGdyb3VwczsgbWVhbndoaWxlLCBmZXcgcGFydGljaXBhbnRzIHNhaWQgdGhhdCBhIGNvbXB1dGVyIGNvdWxkIGZlZWwgcGFpbiwgd2l0aCB0aGUgcHJvcG9ydGlvbiBvZiAieWVzIiByZXNwb25zZXMgZGVjcmVhc2luZyBhY3Jvc3MgYWdlIGdyb3Vwcy4gTW9yZSBkcmFtYXRpYyBjaGFuZ2VzIGFyZSBldmlkZW50IGluIHRoZSBfSEVBUlRfIGFuZCBfTUlORF8gZmFjdG9ycywgd2l0aCBhdHRyaWJ1dGlvbnMgb2YgX0hFQVJUXyBnZW5lcmFsbHkgZGVjcmVhc2luZyBhY3Jvc3MgYWdlIGdyb3VwcyAoZXNwZWNpYWxseSB0byBpbmFuaW1hdGUgdGFyZ2V0IGNoYXJhY3RlcnMgLSBlLmcuLCB0aGUgY29tcHV0ZXIsIHRoZSByb2JvdCksIGFuZCBhdHRyaWJ1dGlvbnMgb2YgX01JTkRfIGdlbmVyYWxseSBpbmNyZWFzaW5nIGFjcm9zcyBhZ2UgZ3JvdXBzIChlc3BlY2lhbGx5IHRvIGFuaW1hdGUgdGFyZ2V0IGNoYXJhY3RlcnMgLSBlLmcuLCB0aGUgbW91c2UsIHRoZSBnb2F0LCB0aGUgZWxlcGhhbnQpLiAoU2VlIFNPTSBmb3IgYW4gYW5hbHlzaXMsIHBhcmFsbGVsIHRvIHRoZSByZWdyZXNzaW9uIGFuYWx5c2VzIGhlcmUsIG9mIHRoZSBwcm9wb3J0aW9uIG9mIHRoZSB0b3AtbG9hZGluZyBtZW50YWwgY2FwYWNpdGllcyBmb3IgZWFjaCBmYWN0b3IgdGhhdCB3ZXJlIGVuZG9yc2VkIGJ5IHBhcnRpY2lwYW50cyBvZiBkaWZmZXJlbnQgYWdlcy4pCgpgYGB7cn0KZDJfYWxsIDwtIGQyX2FkICU+JQogIGZ1bGxfam9pbihkMl83OSkgJT4lCiAgZnVsbF9qb2luKGQyXzQ2KSAlPiUKICBzZWxlY3QoYWdlX2dyb3VwLCBzdWJpZCwgY2hhcmFjdGVyLCBjYXBhY2l0eSwgcmVzcG9uc2VfbnVtKSAlPiUKICBsZWZ0X2pvaW4obG9hZGluZ3NfZnVuKGVmYV8zX2QyX2FkKSAlPiUgCiAgICAgICAgICAgICAgZ3JvdXBfYnkoY2FwYWNpdHkpICU+JQogICAgICAgICAgICAgIHRvcF9uKDEsIGxvYWRpbmcpICU+JQogICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUKICAgICAgICAgICAgICBhcnJhbmdlKGZhY3RvciwgZGVzYyhsb2FkaW5nKSkgJT4lCiAgICAgICAgICAgICAgbXV0YXRlKG9yZGVyID0gMToyMCkgJT4lCiAgICAgICAgICAgICAgc2VsZWN0KGNhcGFjaXR5LCBmYWN0b3IsIG9yZGVyKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShyZXNwb25zZV9udW0pKSAlPiUKICBsZWZ0X2pvaW4oZDJfYWxsX2NoYXIgJT4lIHNlbGVjdCgtcHJvcCkpICU+JQogIG11dGF0ZShyZXNwb25zZSA9IHJlY29kZV9mYWN0b3IocmVzcG9uc2VfbnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjAiID0gIm5vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwLjUiID0gImtpbmRhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxIiA9ICJ5ZXMiKSwKICAgICAgICAgZmFjdG9yID0gcmVjb2RlX2ZhY3RvcihmYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkYxIiA9ICJCT0RZIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRjIiID0gIkhFQVJUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRjMiID0gIk1JTkQiKSwKICAgICAgICAgYWdlX2dyb3VwID0gcmVjb2RlX2ZhY3RvcihhZ2VfZ3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoaWxkcmVuNDYiID0gIjQtNnkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hpbGRyZW43OSIgPSAiNy05eSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZHVsdHMiID0gImFkdWx0cyIpLAogICAgICAgICBjaGFyYWN0ZXIgPSBpZmVsc2UoZ3JlcGwoImJlYXIiLCBhcy5jaGFyYWN0ZXIoY2hhcmFjdGVyKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVkZHkgYmVhciIsIGFzLmNoYXJhY3RlcihjaGFyYWN0ZXIpKSwKICAgICAgICAgY2hhcmFjdGVyID0gZmFjdG9yKGNoYXJhY3RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImNvbXB1dGVyIiwgInJvYm90IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkb2xsIiwgInRlZGR5IGJlYXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVldGxlIiwgImJpcmQiLCAibW91c2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ29hdCIsICJlbGVwaGFudCIpKSwKICAgICAgICAgYWdlX2dyb3VwX24gPSBwYXN0ZTAoYWdlX2dyb3VwLCAiXG4obiA9ICIsIG4sICIpIikpCmBgYAoKYGBge3J9CmZpZzA3YV9mdW4gPC0gZnVuY3Rpb24od2hpY2hmYWMpewogIAogIGZpZyA8LSBkMl9hbGwgJT4lCiAgICBmaWx0ZXIoZmFjdG9yID09IHdoaWNoZmFjKSAlPiUKICAgIGxlZnRfam9pbihkMl9hbmltICU+JSBkaXN0aW5jdChjaGFyYWN0ZXIsIGFuaW1faW5hbikpICU+JQogICAgbXV0YXRlKGFuaW1faW5hbiA9IHJlY29kZV9mYWN0b3IoYW5pbV9pbmFuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluYW5pbWF0ZSIgPSAiaW5hbmltYXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5pbWF0ZSIgPSAiYW5pbWF0ZXMiKSkgJT4lCiAgICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKGNhcGFjaXR5LCBvcmRlciksCiAgICAgICAgICAgICAgIGZpbGwgPSBhbmltX2luYW4sIGFscGhhID0gcmVzcG9uc2UpKSArCiAgICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKGFuaW1faW5hbiksIHJvd3MgPSB2YXJzKGFnZV9ncm91cCksCiAgICAgICAgICAgICAgIHNjYWxlcyA9ICJmcmVlIiwgc3BhY2UgPSAiZnJlZSIpICsKICAgIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArCiAgICAjIGdlb21fbGFiZWwoZGF0YSA9IGQyX2FuaW0gJT4lCiAgICAjICAgICAgICAgICAgICBsZWZ0X2pvaW4oCiAgICAjICAgICAgICAgICAgICAgIGQyX2FsbF9jaGFyICU+JQogICAgIyAgICAgICAgICAgICAgZGlzdGluY3QoY2hhcmFjdGVyLCBmYWN0b3IsIGFnZV9ncm91cCwgbiksCiAgICAjICAgICAgICAgICAgYWVzKHggPSBOQSwgeSA9IE5BLCBhbHBoYSA9IE5BLCBmaWxsID0gTkEsCiAgICAjICAgICAgICAgICAgICAgIGxhYmVsID0gcGFzdGUwKCIobj0iLCBuLCAiKSIpKSwKICAgICMgICAgICAgICAgICB4ID0gMC43NSwgeSA9IDEsIGFscGhhID0gMC44LCBoanVzdCA9IDAsIHZqdXN0ID0gMSwKICAgICMgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiLCBzaXplID0gMykgKwogICAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJQYWlyZWQiKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gYygwLCAwLjUsIDEpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygic2xhdGVncmV5IiwgImZpcmVicmljazEiKSwgbmEudmFsdWUgPSAiZ3JheSIpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoInNsYXRlZ3JleSIsICJmaXJlYnJpY2sxIiksIG5hLnZhbHVlID0gImdyYXkiKSArCiAgICB0aGVtZV9idygpICsKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwKICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgICBsYWJzKHRpdGxlID0gd2hpY2hmYWMsCiAgICAgICAgIHkgPSAicHJvcG9ydGlvbiBvZiBwYXJ0aWNpcGFudHMiLAogICAgICAgICB4ID0gIm1lbnRhbCBjYXBhY2l0eSAoYnkgZmFjdG9yKSIsCiAgICAgICAgIGZpbGwgPSAiYW5pbWFjeSIpICsKICAgIGd1aWRlcyhmaWxsID0gZ3VpZGVfbGVnZW5kKG5yb3cgPSAxLCBieXJvdyA9IFQsIHJldmVyc2UgPSBUKSwKICAgICAgICAgICBhbHBoYSA9ICJub25lIikKICAKICBpZih3aGljaGZhYyAhPSAiTUlORCIpewogICAgZmlnIDwtIGZpZyArIGd1aWRlcyhmaWxsID0gIm5vbmUiLCBhbHBoYSA9ICJub25lIikgKyBsYWJzKHggPSAiIikKICB9CiAgCiAgcmV0dXJuKGZpZykKfQoKZmlnMDdhX0JPRFlfcGxvdCA8LSBmaWcwN2FfZnVuKCJCT0RZIikKZmlnMDdhX0hFQVJUX3Bsb3QgPC0gZmlnMDdhX2Z1bigiSEVBUlQiKQpmaWcwN2FfTUlORF9wbG90IDwtIGZpZzA3YV9mdW4oIk1JTkQiKQoKZmlnMDdhX3Bsb3RzIDwtIHBsb3RfZ3JpZChmaWcwN2FfQk9EWV9wbG90LCBmaWcwN2FfSEVBUlRfcGxvdCwgZmlnMDdhX01JTkRfcGxvdCwKICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgbGFiZWxzID0gIkFVVE8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF9oZWlnaHRzID0gYygxLCAxLCAxLjIpKQpgYGAKCmBgYHtyfQpmaWcwN2JfZnVuIDwtIGZ1bmN0aW9uKHdoaWNoZmFjKXsKICAKICBmaWcgPC0gZDJfYWxsICU+JQogICAgbGVmdF9qb2luKGQyX2FsbF9jaGFyICU+JQogICAgICAgICAgICAgICAgbXV0YXRlKGNoYXJhY3RlciA9IGdzdWIoIl8iLCAiICIsIGFzLmNoYXJhY3RlcihjaGFyYWN0ZXIpKSkgJT4lCiAgICAgICAgICAgICAgICBkaXN0aW5jdChjaGFyYWN0ZXIsIGFnZV9ncm91cCwgbikpICU+JQogICAgZmlsdGVyKGZhY3RvciA9PSB3aGljaGZhYykgJT4lCiAgICBtdXRhdGUoY2hhcmFjdGVyID0gZmFjdG9yKGNoYXJhY3RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiY29tcHV0ZXIiLCAicm9ib3QiLCAiZG9sbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlZGR5IGJlYXIiLCAiYmVldGxlIiwgImJpcmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb3VzZSIsICJnb2F0IiwgImVsZXBoYW50IikpKSAlPiUKICAgIGdncGxvdChhZXMoeCA9IHJlb3JkZXIoY2FwYWNpdHksIG9yZGVyKSwKICAgICAgICAgICAgICAgZmlsbCA9IGNoYXJhY3RlciwgYWxwaGEgPSByZXNwb25zZSkpICsKICAgIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoY2hhcmFjdGVyKSwgcm93cyA9IHZhcnMoYWdlX2dyb3VwKSwKICAgICAgICAgICAgICAgc2NhbGVzID0gImZyZWUiLCBzcGFjZSA9ICJmcmVlIikgKwogICAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsKICAgICMgZ2VvbV9sYWJlbChkYXRhID0gZDJfYWxsICU+JQogICAgIyAgICAgICAgICAgICAgbGVmdF9qb2luKAogICAgIyAgICAgICAgICAgICAgICBkMl9hbGxfY2hhciAlPiUKICAgICMgICAgICAgICAgICAgICAgICBtdXRhdGUoY2hhcmFjdGVyID0gZ3N1YigiXyIsICIgIiwgY2hhcmFjdGVyKSwKICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gZmFjdG9yKGNoYXJhY3RlciwKICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImNvbXB1dGVyIiwgInJvYm90IiwKICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRvbGwiLCAidGVkZHkgYmVhciIsCiAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWV0bGUiLCAiYmlyZCIsCiAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb3VzZSIsICJnb2F0IiwKICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVsZXBoYW50IikpKSkgJT4lCiAgICAjICAgICAgICAgICAgICBkaXN0aW5jdChjaGFyYWN0ZXIsIGZhY3RvciwgYWdlX2dyb3VwLCBuKSwKICAgICMgICAgICAgICAgICBhZXMoeCA9IE5BLCB5ID0gTkEsIGFscGhhID0gTkEsIGZpbGwgPSBOQSwKICAgICMgICAgICAgICAgICAgICAgbGFiZWwgPSBwYXN0ZTAoIihuPSIsIG4sICIpIikpLAogICAgIyAgICAgICAgICAgIHggPSAwLjc1LCB5ID0gMSwgYWxwaGEgPSAwLjgsIGhqdXN0ID0gMCwgdmp1c3QgPSAxLAogICAgIyAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIsIHNpemUgPSAzKSArCiAgICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlBhaXJlZCIpICsKICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBjKDAsIDAuNSwgMSkpICsKICAgIHRoZW1lX2J3KCkgKwogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKICAgIGxhYnModGl0bGUgPSB3aGljaGZhYywKICAgICAgICAgeSA9ICIiLCAKICAgICAgICAgeCA9ICJtZW50YWwgY2FwYWNpdHkgKGJ5IGZhY3RvcikiKSArCiAgICBndWlkZXMoZmlsbCA9IGd1aWRlX2xlZ2VuZChucm93ID0gMSwgYnlyb3cgPSBULCByZXZlcnNlID0gVCksCiAgICAgICAgICAgYWxwaGEgPSBndWlkZV9sZWdlbmQobnJvdyA9IDEsIGJ5cm93ID0gVCkpCiAgCiAgaWYod2hpY2hmYWMgIT0gIk1JTkQiKXsKICAgIGZpZyA8LSBmaWcgKyBndWlkZXMoZmlsbCA9ICJub25lIiwgYWxwaGEgPSAibm9uZSIpICsgbGFicyh4ID0gIiIpCiAgfQogIAogIHJldHVybihmaWcpCn0KCmZpZzA3Yl9CT0RZX3Bsb3QgPC0gZmlnMDdiX2Z1bigiQk9EWSIpCmZpZzA3Yl9IRUFSVF9wbG90IDwtIGZpZzA3Yl9mdW4oIkhFQVJUIikKZmlnMDdiX01JTkRfcGxvdCA8LSBmaWcwN2JfZnVuKCJNSU5EIikKCmZpZzA3Yl9wbG90cyA8LSBwbG90X2dyaWQoZmlnMDdiX0JPRFlfcGxvdCwgZmlnMDdiX0hFQVJUX3Bsb3QsIGZpZzA3Yl9NSU5EX3Bsb3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIGxhYmVscyA9IGMoIkQiLCAiRSIsICJGIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsX2hlaWdodHMgPSBjKDEsIDEsIDEuMikpCmBgYAoKYGBge3J9CmZpZzA3X3Bsb3RzIDwtIHBsb3RfZ3JpZChmaWcwN2FfcGxvdHMsIGZpZzA3Yl9wbG90cywKICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3cgPSAxLCByZWxfd2lkdGhzID0gYygwLjI1LCAxKSkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFQsIGZpZy53aWR0aCA9IDgsIGZpZy5hc3AgPSAxfQpmaWcwN193aXRoX2NhcHRpb24gPC0gYWRkX3N1YihmaWcwN19wbG90cywgc3RyX3dyYXAoIkZpZ3VyZSA3OiBQcm9wb3J0aW9uIG9mIFN0dWR5IDIgcGFydGljaXBhbnRzIHdobyByZXNwb25kZWQgJ3llcycgKGRhcmspLCAna2luZGEnIChtZWRpdW0pLCBvciAnbm8nIChsaWdodCkgdG8gIGVhY2ggbWVudGFsIGNhcGFjaXR5IGl0ZW0sIGdyb3VwZWQgYnkgdGhlIGZhY3RvciBvbiB3aGljaCB0aGV5IGxvYWRpbmcgbW9zdCBwb3NpdGl2ZWx5IChCT0RZLCBIRUFSVCwgTUlORCkgYWNjb3JkaW5nIHRvIGFuIGV4cGxvcmF0b3J5IGZhY3RvciBhbmFseXNpcyBvZiBhZHVsdHMnIHJlc3BvbnNlcy4gRWFjaCBwYXJ0aWNpcGFudCBhc3Nlc3NlZCAyMCBtZW50YWwgY2FwYWNpdGllcyBmb3Igb25lIG9mIG5pbmUgdGFyZ2V0IGNoYXJhY3RlcnMgKDYtMTggcGVyIGNoYXJhY3RlciwgcGVyIGFnZSBncm91cCkuIFdlIHByZXNlbnQgdHdvIHdheXMgb2YgbG9va2luZyBhdCB0aGVzZSBkYXRhOiBjb2xsYXBzaW5nIGNoYXJhY3RlcnMgaW50byBhbmltYXRlcyAoYmVldGxlLCBiaXJkLCBtb3VzZSwgZ29hdCwgZWxlcGhhbnQpIHZzLiBpbmFuaW1hdGVzIChjb21wdXRlciwgcm9ib3QsIGRvbGwsIHRlZGR5IGJlYXI7IFBhbmVscyBBLUMpOyBhbmQgZXhhbWluaW5nIGVhY2ggY2hhcmFjdGVyIGluZGl2aWR1YWxseSAoUGFuZWwgRC1GKS4gUmVzcG9uc2VzIGFyZSBzaG93biBzZXBhcmF0ZWx5IGJ5IGFnZSBncm91cCAoNC02eSwgNy05eSwgYWR1bHRzKS4iLCAxODApLCB4ID0gMCwgaGp1c3QgPSAwKQpnZ2RyYXcoZmlnMDdfd2l0aF9jYXB0aW9uKQpgYGAKCmBgYHtyfQpkMl9hbGxfZW5kb3JzZSA8LSBkMl9hbGwgJT4lCiAgbGVmdF9qb2luKGQyX2FuaW0gJT4lIGRpc3RpbmN0KGNoYXJhY3RlciwgYW5pbV9pbmFuKSkgJT4lCiAgZ3JvdXBfYnkoZmFjdG9yLCBzdWJpZCkgJT4lCiAgdG9wX24oLTYsIG9yZGVyKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKGVuZG9yc2UgPSBpZmVsc2UocmVzcG9uc2VfbnVtID4gMCwgMSwgMCksCiAgICAgICAgIGFuaW1faW5hbiA9IHJlY29kZV9mYWN0b3IoYW5pbV9pbmFuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmFuaW1hdGUiID0gImluYW5pbWF0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmltYXRlIiA9ICJhbmltYXRlcyIpKSAlPiUKICBncm91cF9ieShhZ2VfZ3JvdXAsIHN1YmlkLCBhbmltX2luYW4sIGNoYXJhY3RlciwgZmFjdG9yKSAlPiUKICBzdW1tYXJpc2UocHJvcF9lbmRvcnNlID0gbWVhbihlbmRvcnNlLCBuYS5ybSA9IFQpLAogICAgICAgICAgICBuID0gbGVuZ3RoKGVuZG9yc2UpKSAlPiUKICB1bmdyb3VwKCkKYGBgCgpgYGB7cn0KZDJfYWxsX2VuZG9yc2VfYW5pbV9ib290IDwtIGQyX2FsbF9lbmRvcnNlICU+JQogIGdyb3VwX2J5KGFnZV9ncm91cCwgYW5pbV9pbmFuLCBmYWN0b3IpICU+JQogIG11bHRpX2Jvb3Rfc3RhbmRhcmQoY29sID0gInByb3BfZW5kb3JzZSIpICU+JQogIHVuZ3JvdXAoKQpgYGAKCmBgYHtyfQpmaWdTVVBQMmFfcGxvdCA8LSBkMl9hbGxfZW5kb3JzZSAlPiUKICBmaWx0ZXIoYWdlX2dyb3VwICE9ICJhZHVsdHMiKSAlPiUKICBsZWZ0X2pvaW4oZnVsbF9qb2luKGQyXzc5ICU+JSBkaXN0aW5jdChzdWJpZCwgYWdlKSwKICAgICAgICAgICAgICAgICAgICAgIGQyXzQ2ICU+JSBkaXN0aW5jdChzdWJpZCwgYWdlKSkpICU+JQogIGZpbHRlcighaXMubmEoYWdlKSkgJT4lCiAgbXV0YXRlKGZhY2V0X2xhYiA9ICJhbmltYXRlcyB2cy4gaW5hbmltYXRlcyIpICU+JQogIGdncGxvdChhZXMoeCA9IGFnZSwgeSA9IHByb3BfZW5kb3JzZSwgCiAgICAgICAgICAgICBmaWxsID0gYW5pbV9pbmFuLCBjb2xvciA9IGFuaW1faW5hbikpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKGZhY2V0X2xhYiksIHJvd3MgPSB2YXJzKGZhY3RvcikpICsKICBnZW9tX2ppdHRlcihhbHBoYSA9IDAuNCwgd2lkdGggPSAwLCBoZWlnaHQgPSAwLjAzKSArCiAgYmlub21pYWxfc21vb3RoKGFlcyh3ZWlnaHQgPSBuKSwgYWxwaGEgPSAwLjEwLCBzaG93LmxlZ2VuZCA9IEYpICsKICAjIGdlb21fc21vb3RoKG1ldGhvZCA9ICJnbG0iLAogICMgICAgICAgICAgICAgbWV0aG9kLmFyZ3MgPSBsaXN0KGZhbWlseSA9ICJiaW5vbWlhbCIpKSArCiAgZ2VvbV9wb2ludChkYXRhID0gZDJfYWxsX2VuZG9yc2UgJT4lIGZpbHRlcihhZ2VfZ3JvdXAgPT0gImFkdWx0cyIpLAogICAgICAgICAgICAgYWVzKHggPSAxMSksIGFscGhhID0gMC4yLCBzaG93LmxlZ2VuZCA9IEYsCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyZG9kZ2UoZG9kZ2Uud2lkdGggPSAwLjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaml0dGVyLndpZHRoID0gMC4yNSkpICsKICBnZW9tX3BvaW50cmFuZ2UoZGF0YSA9IGQyX2FsbF9lbmRvcnNlX2FuaW1fYm9vdCAlPiUgCiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGFnZV9ncm91cCA9PSAiYWR1bHRzIiksCiAgICAgICAgICAgICAgICAgIGFlcyh4ID0gMTEsIHkgPSBtZWFuLCB5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyZG9kZ2UoZG9kZ2Uud2lkdGggPSAwLjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaml0dGVyLndpZHRoID0gMC4yNSksIAogICAgICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEYsIGNvbG9yID0gImJsYWNrIiwgZmF0dGVuID0gMS41LCBzaGFwZSA9IDIxKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGMoNDoxMSksIAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKHBhc3RlMCg0OjEwLCAieSIpLCAiYWR1bHRzIikpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEsIDEvNiksIGxhYmVscyA9IDA6NikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJzbGF0ZWdyZXkiLCAiZmlyZWJyaWNrMSIpLCBuYS52YWx1ZSA9ICJncmF5IikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoInNsYXRlZ3JleSIsICJmaXJlYnJpY2sxIiksIG5hLnZhbHVlID0gImdyYXkiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QoYWxwaGEgPSAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyA9IDIsIGJ5cm93ID0gVCwgcmV2ZXJzZSA9IFQpLAogICAgICAgICBmaWxsID0gZ3VpZGVfbGVnZW5kKG5yb3cgPSAyLCBieXJvdyA9IFQsIHJldmVyc2UgPSBUKSkgKwogIGxhYnMoeSA9ICJudW1iZXIgb2YgY2FwYWNpdGllcyBlbmRvcnNlZCIsIAogICAgICAgY29sb3IgPSAiYW5pbWFjeSIsIGZpbGwgPSAiYW5pbWFjeSIpCmBgYAoKYGBge3J9CmQyX2FsbF9lbmRvcnNlX2Jvb3QgPC0gZDJfYWxsX2VuZG9yc2UgJT4lCiAgZ3JvdXBfYnkoYWdlX2dyb3VwLCBjaGFyYWN0ZXIsIGZhY3RvcikgJT4lCiAgbXVsdGlfYm9vdF9zdGFuZGFyZChjb2wgPSAicHJvcF9lbmRvcnNlIikgJT4lCiAgdW5ncm91cCgpCmBgYAoKYGBge3J9CmZpZ1NVUFAyYl9wbG90IDwtIGQyX2FsbF9lbmRvcnNlICU+JQogIGZpbHRlcihhZ2VfZ3JvdXAgIT0gImFkdWx0cyIpICU+JQogIGxlZnRfam9pbihmdWxsX2pvaW4oZDJfNzkgJT4lIGRpc3RpbmN0KHN1YmlkLCBhZ2UpLAogICAgICAgICAgICAgICAgICAgICAgZDJfNDYgJT4lIGRpc3RpbmN0KHN1YmlkLCBhZ2UpKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShhZ2UpKSAlPiUKICBtdXRhdGUoZmFjZXRfbGFiID0gImluZGl2aWR1YWwgY2hhcmFjYXRlcnMiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBhZ2UsIHkgPSBwcm9wX2VuZG9yc2UsIAogICAgICAgICAgICAgZmlsbCA9IGNoYXJhY3RlciwgY29sb3IgPSBjaGFyYWN0ZXIpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhmYWNldF9sYWIpLCByb3dzID0gdmFycyhmYWN0b3IpKSArCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjQsIHdpZHRoID0gMCwgaGVpZ2h0ID0gMC4wMykgKwogIGJpbm9taWFsX3Ntb290aChhZXMod2VpZ2h0ID0gbiksIGFscGhhID0gMC4xMCwgc2hvdy5sZWdlbmQgPSBGKSArCiAgIyBnZW9tX3Ntb290aChtZXRob2QgPSAiZ2xtIiwKICAjICAgICAgICAgICAgIG1ldGhvZC5hcmdzID0gbGlzdChmYW1pbHkgPSAiYmlub21pYWwiKSkgKwogIGdlb21fcG9pbnQoZGF0YSA9IGQyX2FsbF9lbmRvcnNlICU+JSBmaWx0ZXIoYWdlX2dyb3VwID09ICJhZHVsdHMiKSwKICAgICAgICAgICAgIGFlcyh4ID0gMTIpLCBhbHBoYSA9IDAuMiwgc2hvdy5sZWdlbmQgPSBGLAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDIpKSArCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSBkMl9hbGxfZW5kb3JzZV9ib290ICU+JSBmaWx0ZXIoYWdlX2dyb3VwID09ICJhZHVsdHMiKSwKICAgICAgICAgICAgICAgICAgYWVzKHggPSAxMiwgeSA9IG1lYW4sIHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwKICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDIpLCBzaG93LmxlZ2VuZCA9IEYsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgZmF0dGVuID0gMS41LCBzaGFwZSA9IDIxKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGMoNDoxMCwgMTIpLCAKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYyhwYXN0ZTAoNDoxMCwgInkiKSwgImFkdWx0cyIpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxLCAxLzYpLCBsYWJlbHMgPSAwOjYpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJQYWlyZWQiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJQYWlyZWQiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QoYWxwaGEgPSAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyA9IDIsIGJ5cm93ID0gVCwgcmV2ZXJzZSA9IFQpLAogICAgICAgICBmaWxsID0gZ3VpZGVfbGVnZW5kKG5yb3cgPSAyLCBieXJvdyA9IFQsIHJldmVyc2UgPSBUKSkgKwogIGxhYnMoeSA9ICIiKQpgYGAKCmBgYHtyfQpmaWdTVVBQMl9wbG90cyA8LSBwbG90X2dyaWQoZmlnU1VQUDJhX3Bsb3QsIGZpZ1NVUFAyYl9wbG90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyA9IDEsIHJlbF93aWR0aHMgPSBjKDAuODUsIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gIkFVVE8iKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRiwgZmlnLndpZHRoID0gNiwgZmlnLmFzcCA9IDF9CmZpZ1NVUFAyX3dpdGhfY2FwdGlvbiA8LSBhZGRfc3ViKGZpZ1NVUFAyX3Bsb3RzLCBzdHJfd3JhcCgiRmlndXJlIFNVUFAyOiBOdW1iZXIgb2YgbWVudGFsIGNhcGFjaXR5IGl0ZW1zIChvdXQgb2YgNikgZW5kb3JzZWQgaW4gZWFjaCBkb21haW4gKEJPRFksIEhFQVJULCBhbmQgTUlORCkgYnkgNC0gdG8gOS15ZWFyLW9sZCBjaGlsZHJlbiBhbmQgYWR1bHRzIGluIFN0dWR5IDIsIGluIHdoaWNoIGVhY2ggcGFydGljaXBhbnQgYXNzZXNzZWQgMjAgbWVudGFsIGNhcGFjaXRpZXMgZm9yIG9uZSBvZiBuaW5lIHRhcmdldCBjaGFyYWN0ZXJzLiBXZSBkZWZpbmVkIGVhY2ggZG9tYWluIGJ5IHRoZSA2IGl0ZW1zIHRoYXQgbG9hZGVkIHRoZSBtb3N0IHBvc2l0aXZlbHkgb24gdGhlIGNvcnJlc3BvbmRpbmcgZmFjdG9yIGluIGFuIGV4cGxvcmF0b3J5IGZhY3RvciBhbmFseXNpcyBvZiBhZHVsdHMnIHJlc3BvbnNlcywgYW5kIHdlIGNvbnNpZGVyZWQgcmVzcG9uc2VzIG9mIGVpdGhlciAneWVzJyBvciAna2luZGEnIChidXQgbm90ICdubycpIHRvIGJlIGVuZG9yc2VtZW50cy4gTGluZXMgY29ycmVzcG9uZCB0byBsb2dpc3RpYyByZWdyZXNzaW9ucyBjb25zaWRlcmluZyBjaGlsZHJlbidzIHNjb3JlcyBhbG9uZS4gRXJyb3IgYmFycyBhcmUgYm9vdHN0cmFwcGVkIDk1JSBjb25maWRlbmNlIGludGVydmFscyBvbiBhZHVsdHMnIHNjb3Jlcy4iLCAxNTMpLCB4ID0gMCwgaGp1c3QgPSAwKQpnZ2RyYXcoZmlnU1VQUDJfd2l0aF9jYXB0aW9uKQpgYGAKCiMjIyMgQWdlIGRpZmZlcmVuY2VzIHdpdGhpbiB0aGUgY2hpbGQgc2FtcGxlcwoKQXMgaW4gU3R1ZHkgMSwgd2Ugd2VyZSBpbnRlcmVzdGVkIG5vdCBvbmx5IGluIGRpZmZlcmVuY2VzIGFjcm9zcyBhZ2UgZ3JvdXBzLCBidXQgYWxzbyBhY3Jvc3MgdGhl4oCUZXZlbiB3aWRlcuKAlGFnZSByYW5nZSB3aXRoaW4gb3VyIGNoaWxkIHNhbXBsZXMuIEluIFN0dWR5IDIsIHRoaXMgaW5jbHVkZWQgY2hpbGRyZW4gYXMgeW91bmcgYXMgNCB5ZWFycyB1cCB0byBuZWFybHkgMTAgeWVhcnMgb2YgYWdlLiBUaGlzIGFsbG93ZWQgdXMgdG8gbG9vayBhdCBhZ2UtcmVsYXRlZCBkaWZmZXJlbmNlcyBpbiBtZW50YWwgY2FwYWNpdHkgYXR0cmlidXRpb25zIGFjcm9zcyBhIHdpZGUgcGVyaW9kIGZyb20gZWFybHkgdG8gbWlkZGxlIGNoaWxkaG9vZC4KCmBgYHtyfQojIGQyXzQ5X2FuaW1fciA8LSBicm0oc2NvcmUgfiBmYWN0b3JfbmFtZSAqIGFuaW1faW5hbiAqIGFnZSArCiMgICAgICAgICAgICAgICAgICAgICAgICgxIHwgc3ViaWQpICsKIyAgICAgICAgICAgICAgICAgICAgICAgKDEgKyBmYWN0b3JfbmFtZSB8IGNoYXJhY3RlciksCiMgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZDJfYW5pbSAlPiUKIyAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGFnZV9ncm91cCAhPSAiYWR1bHRzIiwgIWlzLm5hKGFnZSkpICU+JQojICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoYWdlID0gc2NhbGUoYWdlLCBzY2FsZSA9IEYpKSwKIyAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45OSksCiMgICAgICAgICAgICAgICAgICAgICBjb3JlcyA9IDQpCiMgc2F2ZVJEUyhkMl80OV9hbmltX3IsIGZpbGUgPSAiLi9icm1zX21vZGVscy9kMl80OV9hbmltX3IucmRzIikKCmQyXzQ5X2FuaW1fciA8LSByZWFkUkRTKCIuL2JybXNfbW9kZWxzL2QyXzQ5X2FuaW1fci5yZHMiKQojIHN1bW1hcnkoZDJfNDlfYW5pbV9yKQpgYGAKCmBgYHtyfQpkMl9jaF9hZ2UgPC0gZnVsbF9qb2luKGQyXzQ2ICU+JSBkaXN0aW5jdChzdWJpZCwgYWdlKSwKICAgICAgICAgICAgICAgICAgICAgICBkMl83OSAlPiUgZGlzdGluY3Qoc3ViaWQsIGFnZSkpCmBgYAoKVG8gZXhwbG9yZSBhZ2UtcmVsYXRlZCBkaWZmZXJlbmNlcyBjb250aW51b3VzbHkgd2l0aGluIHRoZSBjaGlsZCBzYW1wbGVzLCB3ZSBjb25kdWN0ZWQgYW4gYWRkaXRpb25hbCByZWdyZXNzaW9uIGFuYWx5c2lzIG9uIGNoaWxkcmVuJ3MgZmFjdG9yIHNjb3JlcyBhbG9uZSwgaW5jbHVkaW5nIGludGVyYWN0aW9ucyB3aXRoIGV4YWN0IGFnZSBpbiB5ZWFycyAoY2VudGVyZWQgYXQgdGhlIG1lYW46IGByIGZvcm1hdChyb3VuZChtZWFuKGQyX2NoX2FnZSRhZ2UsIG5hLnJtID0gVCksIDIpLCBuc21hbGwgPSAyKWB5KSByYXRoZXIgdGhhbiBhZ2UgZ3JvdXAuIFNlZSBUYWJsZSA0IGZvciB0aGUgZnVsbCByZXN1bHRzIG9mIHRoaXMgbW9kZWwsIGFuZCBGaWd1cmUgOCBmb3IgYSB2aXN1YWxpemF0aW9uIG9mIGNoYW5nZXMgaW4gY2hpbGRyZW4ncyBmYWN0b3Igc2NvcmVzIGFjcm9zcyB0aGUgYWdlIHJhbmdlLgoKVGhpcyBhbmFseXNpcyBjb25maXJtZWQgdGhhdCwgcmVsYXRpdmUgdG8gdGhlIGdyYW5kIG1lYW4sIGF0dHJpYnV0aW9ucyBvZiBfSEVBUlRfIGRlY3JlYXNlZCB3aXRoIGFnZSAoYHIgd3JpdGVfYl85NUNJX2Z1bihkMl80OV9hbmltX3IsICJmYWN0b3JfbmFtZUhfR006YWdlIilgKSBhbmQgYXR0cmlidXRpb25zIG9mIF9NSU5EXyBpbmNyZWFzZWQgd2l0aCBhZ2UgKGByIHdyaXRlX2JfOTVDSV9mdW4oZDJfNDlfYW5pbV9yLCAiZmFjdG9yX25hbWVNX0dNOmFnZSIpYCkuIFRoZXNlIGZpbmRpbmdzIGFyZSBib3RoIGluIGxpbmUgd2l0aCB0aGUgYWdlIGdyb3VwIGFuYWx5c2lzIGRlc2NyaWJlZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiwgc3VnZ2VzdGluZyB0aGF0IHRoZSBvYnNlcnZlZCBncm91cCBkaWZmZXJlbmNlcyBjb3JyZXNwb25kIHRvIGdyYWR1YWwgZGV2ZWxvcG1lbnRhbCBkaWZmZXJlbmNlcyBhcyBjaGlsZHJlbidzIHJlc3BvbnNlcyBiZWNvbWUgaW5jcmVhc2luZ2x5IGFkdWx0LWxpa2UuIAoKSWYgY2hpbGRyZW4gd2VyZSBhbHNvIGJlY29taW5nIGluY3JlYXNpbmdseSBhZHVsdC1saWtlIGluIHRoZWlyIGRpc3RpbmN0aW9ucyBiZXR3ZWVuIGFuaW1hdGUgYW5kIGluYW5pbWF0ZSB0YXJnZXQgY2hhcmFjdGVycywgYmFzZWQgb24gdGhlIHJlc3VsdHMgb2Ygb3VyIGFnZSBncm91cCBhbmFseXNpcyAocHJldmlvdXMgc2VjdGlvbikgd2Ugd291bGQgYWxzbyBleHBlY3QgdGhlIG92ZXJhbGwgYW5pbWF0ZS1pbmFuaW1hdGUgZGlzdGluY3Rpb24gdG8gaW5jcmVhc2Ugd2l0aCBhZ2UsIGRyaXZlbiBwcmltYXJpbHkgYnkgaW5jcmVhc2VzIGluIHRoZSBfQk9EWV8gYW5kIGVzcGVjaWFsbHkgX01JTkRfIGRvbWFpbnMgKHNlZSBGaWd1cmUgNiwgUGFuZWwgQSkuIEluc3RlYWQsIGNvbGxhcHNpbmcgYWNyb3NzIGZhY3RvcnMsIHRoZSBnZW5lcmFsIGRpc3RpbmN0aW9uIGJldHdlZW4gYW5pbWF0ZXMgYW5kIGluYW5pbWF0ZXMgZGlkIF9ub3RfIGRpZmZlciB3aXRoIGFnZSAoYHIgd3JpdGVfYl85NUNJX2Z1bihkMl80OV9hbmltX3IsICJhbmltX2luYW5hbmltX0dNOmFnZSIpYCk7IF9kZWNyZWFzZWRfIGluIHRoZSBfSEVBUlRfIGRvbWFpbiwgcmVsYXRpdmUgdG8gdGhlIGdyYW5kIG1lYW4gKGByIHdyaXRlX2JfOTVDSV9mdW4oZDJfNDlfYW5pbV9yLCAiZmFjdG9yX25hbWVIX0dNOmFuaW1faW5hbmFuaW1fR006YWdlIilgKTsgYW5kIGRpZCBub3QgY2hhbmdlIHN1YnN0YW50aWFsbHkgaW4gdGhlIF9NSU5EXyBkb21haW4gKGByIHdyaXRlX2JfOTVDSV9mdW4oZDJfNDlfYW5pbV9yLCAiZmFjdG9yX25hbWVNX0dNOmFuaW1faW5hbmFuaW1fR006YWdlIilgKS4gCgpXZSBub3RlIHRoYXQgcGFydGljaXBhbnRzIHdobyBhc3Nlc3NlZCB0aGUgcm9ib3Qgc2VlbWVkIHRvIGJlY29tZSBwYXJ0aWN1bGFybHkgdW4tYWR1bHQtbGlrZSBhdCBvbGRlciBhZ2VzIChzZWUgRmlndXJlIDgsIFBhbmVsIEIsIGluIGJsdWUpLiBFeGNsdWRpbmcgdGhlc2UgcGFydGljaXBhbnRzIHlpZWxkcyBhIG1vcmUgY29oZXJlbnQgcGljdHVyZSBvZiBpbmNyZWFzaW5nIGFkdWx0LWxpa2UtbmVzcyB3aXRoIGluY3JlYXNpbmcgYWdlIChGaWd1cmUgOCwgUGFuZWwgQSwgaW4gdHVycXVvaXNlKS4gVGhpcyBkaWQgbm90IGFwcGVhciB0byBiZSB0aGUgY2FzZSB3aGVuIGV4Y2x1ZGluZyBhbnkgb2YgdGhlIG90aGVyIGluYW5pbWF0ZSB0YXJnZXQgY2hhcmFjdGVycy4gV2UgZWxhYm9yYXRlIG9uIGNoaWxkcmVuJ3MgY29uY2VwdHVhbGl6YXRpb25zIG9mIHRoZSBtZW50YWwgbGl2ZXMgb2Ygcm9ib3RzIGluIHBhcnRpY3VsYXIgaW4gdGhlIEdlbmVyYWwgRGlzY3Vzc2lvbiAoc2VlIGFsc28gV2Vpc21hbiwgdW5kZXIgcmV2aWV3KS4gKFNlZSBhbHNvIFNPTSBmb3IgYW4gYW5hbHlzaXMgb2YgaG93IGV4Y2x1ZGluZyBhbnkgaW5kaXZpZHVhbCB0YXJnZXQgY2hhcmFjdGVyLCBvciBhbnkgaW5kaXZpZHVhbCBtZW50YWwgY2FwYWNpdHksIGFmZmVjdHMgdGhlIGNvbmNlcHR1YWwgc3RydWN0dXJlcyByZXZlYWxlZCBieSBmYWN0b3IgYW5hbHlzaXMgZm9yIGVhY2ggb2YgdGhlIHRocmVlIGFnZSBncm91cHMgaW4gU3R1ZHkgMi4pCgpgYGB7ciwgaW5jbHVkZSA9IFQsIHJlc3VsdHMgPSAiYXNpcyJ9CmZpeGVmKGQyXzQ5X2FuaW1fcikgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiUGFyYW1ldGVyIikgJT4lCiAgbXV0YXRlKFBhcmFtZXRlciA9IHJlY29kZV9mYWN0b3IoCiAgICBQYXJhbWV0ZXIsCiAgICAjIE9WRVJBTEwKICAgICJJbnRlcmNlcHQiID0gIihJbnRlcmNlcHQpIiwKICAgICJmYWN0b3JfbmFtZUhfR00iID0gIkhFQVJUICh2cy4gZ3JhbmQgbWVhbikiLAogICAgImZhY3Rvcl9uYW1lTV9HTSIgPSAiTUlORCAodnMuIGdyYW5kIG1lYW4pIiwKICAgICJhbmltX2luYW5hbmltX0dNIiA9ICJjaGFyYWN0ZXJzOiBhbmltYXRlcyB2cy4gaW5hbmltYXRlcyIsCiAgICAiZmFjdG9yX25hbWVIX0dNOmFuaW1faW5hbmFuaW1fR00iID0gImNoYXJhY3RlcnMgKGFuaW1hdGVzL2luYW5pbWF0ZXMpIMOXIEhFQVJUIiwKICAgICJmYWN0b3JfbmFtZU1fR006YW5pbV9pbmFuYW5pbV9HTSIgPSAiY2hhcmFjdGVycyAoYW5pbWF0ZXMvaW5hbmltYXRlcykgw5cgTUlORCIsCiAgICAjIEJZIEFHRQogICAgImFnZSIgPSAiYWdlIChjZW50ZXJlZCBhdCB0aGUgbWVhbikiLAogICAgImZhY3Rvcl9uYW1lSF9HTTphZ2UiID0gIkhFQVJUIMOXIGFnZSIsCiAgICAiZmFjdG9yX25hbWVNX0dNOmFnZSIgPSAiTUlORCDDlyBhZ2UiLAogICAgImFuaW1faW5hbmFuaW1fR006YWdlIiA9ICJjaGFyYWN0ZXJzIChhbmltYXRlcy9pbmFuaW1hdGVzKSDDlyBhZ2UiLAogICAgImZhY3Rvcl9uYW1lSF9HTTphbmltX2luYW5hbmltX0dNOmFnZSIgPSAiY2hhcmFjdGVycyAoYW5pbWF0ZXMvaW5hbmltYXRlcykgw5cgSEVBUlQgw5cgYWdlIiwKICAgICJmYWN0b3JfbmFtZU1fR006YW5pbV9pbmFuYW5pbV9HTTphZ2UiID0gImNoYXJhY3RlcnMgKGFuaW1hdGVzL2luYW5pbWF0ZXMpIMOXIE1JTkQgw5cgYWdlIikpICU+JQogIGFycmFuZ2UoUGFyYW1ldGVyKSAlPiUKICBtdXRhdGUoWCA9IGlmZWxzZShRMi41ICogUTk3LjUgPiAwLCAiKiIsICIiKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoLVBhcmFtZXRlciwgLVgpLAogICAgICAgICAgICBmdW5zKGZvcm1hdChyb3VuZCguLCAyKSwgbnNtYWxsID0gMikpKSAlPiUKICByZW5hbWUoYiA9IEVzdGltYXRlLCBFcnJvciA9IEVzdC5FcnJvciwgIiAiID0gWCkgJT4lCiAgdW5pdGUoYDk1JSBDSWAsIFEyLjUsIFE5Ny41LCBzZXAgPSAiLCAiKSAlPiUKICBtdXRhdGUoYDk1JSBDSWAgPSBwYXN0ZTAoIlsiLCBgOTUlIENJYCwgIl0iKSkgJT4lCiAga25pdHI6OmthYmxlKGZvcm1hdCA9ICJodG1sIiwgYWxpZ24gPSBjKCJsIiwgcmVwKCJyIiwgMykpLAogICAgICAgICAgICAgICBjYXB0aW9uID0gIlRhYmxlIDQ6IEZpeGVkIGVmZmVjdHMgZnJvbSBhIG1peGVkLWVmZmVjdHMgQmF5ZXNpYW4gcmVncmVzc2lvbiBtb2RlbCBvZiBjaGlsZHJlbidzIHJlc3BvbnNlcywgcHJlZGljdGluZyBmYWN0b3Igc2NvcmVzIGluIFN0dWR5IDIgYnkgYW5pbWFjeSBzdGF0dXMgKGFuaW1hdGVzLCBpbmFuaW1hdGVzKSwgZmFjdG9yIChCT0RZLCBIRUFSVCwgTUlORCksIGFuZCBleGFjdCBhZ2UuIFRoZSBtb2RlbCB1c2VkIHRoZSBmb3JtdWxhICdmYWN0b3Igc2NvcmUgfiBmYWN0b3IgKiBhZ2UgKiBhbmltYWN5ICsgKDEgfCBzdWJqZWN0KScgYW5kIHdhcyBpbXBsZW1lbnRlZCBpbiB0aGUgJ2JybXMnIHBhY2thZ2UgZm9yIFIgKELDvHJrbmVyLCAyMDE3KS4gRmFjdG9yIGFuZCBhbmltYWN5IHdlcmUgZWZmZWN0LWNvZGVkLCBhbmQgYWdlIHdhcyBtZWFuLWNlbnRlcmVkLiBBc3Rlcmlza3MgbWFyayBwYXJhbWV0ZXJzIHdob3NlIDk1JSBjcmVkaWJsZSBpbnRlcnZhbCBkb2VzIG5vdCBpbmNsdWRlIDAuIikgJT4lCiAga2FibGVfc3R5bGluZygpICU+JQogIGdyb3VwX3Jvd3MoIkNvbGxhcHNpbmcgYWNyb3NzIGFnZSIsIDEsIDYpICU+JQogIGdyb3VwX3Jvd3MoIkFnZSBlZmZlY3RzIiwgNywgMTIpCmBgYAoKYGBge3J9CmZpZzA4YV9wbG90IDwtIGdncGxvdChkMl9hbmltICU+JSAKICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoIWlzLm5hKGFnZSkpICU+JQogICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoZmFjZXRfbGFiID0gImFuaW1hdGVzIHZzLiBpbmFuaW1hdGVzIikgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxfam9pbihkYXRhLmZyYW1lKGZhY2V0X2xhYiA9ICJhbmltYXRlcyB2cy4gaW5hbmltYXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1faW5hbiA9ICJkdW1teSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZSA9IDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lID0gIkJPRFkiKSksCiAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gYWdlLCB5ID0gc2NvcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gYW5pbV9pbmFuLCBjb2xvciA9IGFuaW1faW5hbiwgZ3JvdXAgPSBhbmltX2luYW4pKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhmYWN0b3JfbmFtZSksIGNvbHMgPSB2YXJzKGZhY2V0X2xhYiksIHNjYWxlcyA9ICJmcmVlIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDIpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC4yKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgYWxwaGEgPSAwLjEwLCBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3BvaW50KGRhdGEgPSBkMl9hbmltICU+JSBmaWx0ZXIoYWdlX2dyb3VwID09ICJhZHVsdHMiKSwKICAgICAgICAgICAgIGFlcyh4ID0gMTEpLCBhbHBoYSA9IDAuMiwgc2hvdy5sZWdlbmQgPSBGLAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJkb2RnZShkb2RnZS53aWR0aCA9IDAuNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci53aWR0aCA9IDAuMjUpKSArCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSBkMl9hbmltICU+JSAKICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoYWdlX2dyb3VwID09ICJhZHVsdHMiKSAlPiUKICAgICAgICAgICAgICAgICAgICBncm91cF9ieShhZ2VfZ3JvdXAsIGZhY3Rvcl9uYW1lLCBhbmltX2luYW4pICU+JQogICAgICAgICAgICAgICAgICAgIG11bHRpX2Jvb3Rfc3RhbmRhcmQoY29sID0gInNjb3JlIikgJT4lIAogICAgICAgICAgICAgICAgICAgIHVuZ3JvdXAoKSwKICAgICAgICAgICAgICAgICAgYWVzKHggPSAxMSwgeSA9IG1lYW4sIHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwKICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSksIHNob3cubGVnZW5kID0gRiwgCiAgICAgICAgICAgICAgICAgICMgZmF0dGVuID0gMS41LCAKICAgICAgICAgICAgICAgICAgc2hhcGUgPSAyMSwgY29sb3IgPSAiYmxhY2siKSArCiAgIyBFWENMVURFIFJPQk9UCiAgZ2VvbV9zbW9vdGgoZGF0YSA9IGZ1bmN0aW9uKHgpe3ggJT4lIAogICAgICBmaWx0ZXIoY2hhcmFjdGVyICE9ICJyb2JvdCIsIGFuaW1faW5hbiA9PSAiaW5hbmltYXRlIikgJT4lCiAgICAgIG11dGF0ZShhbmltX2luYW4gPSAiaW5hbl9ub3JvYm90Iil9LAogICAgICBhZXMoY29sb3IgPSBhbmltX2luYW4pLAogICAgICBtZXRob2QgPSAibG0iLCBhbHBoYSA9IDAuMTAsIHNob3cubGVnZW5kID0gRiwgbHR5ID0gMSwgc2l6ZSA9IDAuNCkgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gZWZhXzNfc2NvcmVzX2QyX2FsbCAlPiUgCiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGNoYXJhY3RlciAhPSAicm9ib3QiKSAlPiUKICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoYWdlX2dyb3VwID09ICJhZHVsdHMiKSAlPiUKICAgICAgICAgICAgICAgICAgICBsZWZ0X2pvaW4oZDJfYW5pbSAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGluY3QoY2hhcmFjdGVyLCBhbmltX2luYW4pKSAlPiUKICAgICAgICAgICAgICAgICAgICBncm91cF9ieShmYWN0b3JfbmFtZSwgYW5pbV9pbmFuKSAlPiUKICAgICAgICAgICAgICAgICAgICBtdWx0aV9ib290X3N0YW5kYXJkKGNvbCA9ICJzY29yZSIpICU+JQogICAgICAgICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUKICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoYW5pbV9pbmFuID09ICJpbmFuaW1hdGUiKSAlPiUKICAgICAgICAgICAgICAgICAgICBtdXRhdGUoYW5pbV9pbmFuID0gImluYW5fbm9yb2JvdCIpLAogICAgICAgICAgICAgICAgICBhZXMoY29sb3IgPSBhbmltX2luYW4sCiAgICAgICAgICAgICAgICAgICAgICB4ID0gMTEgKyAoLjI1LzIgKyAuMjUpLCAKICAgICAgICAgICAgICAgICAgICAgIHkgPSBtZWFuLCB5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpLCBzaG93LmxlZ2VuZCA9IEYsCiAgICAgICAgICAgICAgICAgIGZhdHRlbiA9IDMsCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMTgpICsKICAjIHJlc3VtZQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKDQ6MTEpLCBtaW5vcl9icmVha3MgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKHBhc3RlMCg0OjEwLCAieSIpLCAiYWR1bHRzIikpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0xMCwgMTAsIDEpLCBtaW5vcl9icmVha3MgPSBOVUxMKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImZpcmVicmljazEiLCAid2hpdGUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGFya3R1cnF1b2lzZSIsICJzbGF0ZWdyZXkiKSwgCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoImFuaW1hdGUiLCAiZHVtbXkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5hbmltYXRlIiwgImluYW5fbm9yb2JvdCIpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJhbmltYXRlcyIsICIgIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluYW5pbWF0ZXMiLCAiKG5vIHJvYm90KSIpLAogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5IikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImZpcmVicmljazEiLCAid2hpdGUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGFya3R1cnF1b2lzZSIsICJzbGF0ZWdyZXkiKSwKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygiYW5pbWF0ZSIsICJkdW1teSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmFuaW1hdGUiLCAiaW5hbl9ub3JvYm90IiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImFuaW1hdGVzIiwgIiAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5hbmltYXRlcyIsICIobm8gcm9ib3QpIiksCiAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChhbHBoYSA9IDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBucm93ID0gMiwgYnlyb3cgPSBULCByZXZlcnNlID0gRiksCiAgICAgICAgIGZpbGwgPSBndWlkZV9sZWdlbmQobnJvdyA9IDIsIGJ5cm93ID0gVCwgcmV2ZXJzZSA9IEYpKSArCiAgbGFicyh4ID0gImFnZSIsIHkgPSAiZmFjdG9yIHNjb3JlIiwgCiAgICAgICBjb2xvciA9ICJhbmltYWN5IiwgZmlsbCA9ICJhbmltYWN5IikKYGBgCgpgYGB7cn0KZmlnMDhiX3Bsb3QgPC0gZ2dwbG90KGVmYV8zX3Njb3Jlc19kMl9hbGwgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcighaXMubmEoYWdlKSkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShmYWNldF9sYWIgPSAiaW5kaXZpZHVhbCBjaGFyYWN0ZXJzIiksCiAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IGFnZSwgeSA9IHNjb3JlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBjaGFyYWN0ZXIsIGNvbG9yID0gY2hhcmFjdGVyKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoY2hhcmFjdGVyKSwgcm93cyA9IHZhcnMoZmFjdG9yX25hbWUpLCBzY2FsZXMgPSAiZnJlZSIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsdHkgPSAyKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNSkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGFscGhhID0gMC4yMCwgc2hvdy5sZWdlbmQgPSBGKSArCiAgZ2VvbV9wb2ludChkYXRhID0gZWZhXzNfc2NvcmVzX2QyX2FsbCAlPiUgZmlsdGVyKGFnZV9ncm91cCA9PSAiYWR1bHRzIiksCiAgICAgICAgICAgICBhZXMoeCA9IDExKSwgYWxwaGEgPSAwLjUsIHNob3cubGVnZW5kID0gRiwKICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoID0gMC4yNSkpICsKICBnZW9tX3BvaW50cmFuZ2UoZGF0YSA9IGVmYV8zX3Njb3Jlc19ib290X2QyX2FsbCAlPiUgCiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGFnZV9ncm91cCA9PSAiYWR1bHRzIiksCiAgICAgICAgICAgICAgICAgIGFlcyh4ID0gMTEsIHkgPSBtZWFuLCB5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksCiAgICAgICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRiwKICAgICAgICAgICAgICAgICAgIyBmYXR0ZW4gPSAxLjUsIAogICAgICAgICAgICAgICAgICBzaGFwZSA9IDIxLCBjb2xvciA9ICJibGFjayIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYyg0OjExKSwgbWlub3JfYnJlYWtzID0gTlVMTCwgCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMocGFzdGUwKDQ6MTAsICJ5IiksICJhZHVsdHMiKSkgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoLTEwLCAxMCwgMSksIG1pbm9yX2JyZWFrcyA9IE5VTEwpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJQYWlyZWQiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJQYWlyZWQiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QoYWxwaGEgPSAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyA9IDIsIGJ5cm93ID0gVCwgcmV2ZXJzZSA9IFQpLAogICAgICAgICBmaWxsID0gZ3VpZGVfbGVnZW5kKG5yb3cgPSAyLCBieXJvdyA9IFQsIHJldmVyc2UgPSBUKSkgKwogIGxhYnMoeSA9ICIiKQpgYGAKCmBgYHtyfQpmaWcwOF9wbG90cyA8LSBwbG90X2dyaWQoZmlnMDhhX3Bsb3QsIGZpZzA4Yl9wbG90LAogICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyA9IDEsIHJlbF93aWR0aHMgPSBjKDAuMTUsIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gIkFVVE8iKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVCwgZmlnLndpZHRoID0gMTAsIGZpZy5hc3AgPSAwLjR9CmZpZzA4X3dpdGhfY2FwdGlvbiA8LSBhZGRfc3ViKGZpZzA4X3Bsb3RzLCBzdHJfd3JhcCgiRmlndXJlIDg6IEZhY3RvciBzY29yZXMgZm9yIGFkdWx0cyBhbmQgNC0gdG8gOS15ZWFyLW9sZCBjaGlsZHJlbiBpbiBTdHVkeSAxLCByZXBsb3R0ZWQgdG8gaWxsdXN0cmF0ZSBhZ2UgZWZmZWN0cyB3aXRoaW4gdGhlIGNoaWxkIHNhbXBsZXMuIFdlIHByZXNlbnQgdHdvIHdheXMgb2YgbG9va2luZyBhdCB0aGVzZSBkYXRhOiBjb2xsYXBzaW5nIGNoYXJhY3RlcnMgaW50byBhbmltYXRlcyAoYmVldGxlLCBiaXJkLCBtb3VzZSwgZ29hdCwgZWxlcGhhbnQpIHZzLiBpbmFuaW1hdGVzIChjb21wdXRlciwgcm9ib3QsIGRvbGwsIHRlZGR5IGJlYXI7IFBhbmVsIEEpOyBhbmQgZXhhbWluaW5nIGVhY2ggY2hhcmFjdGVyIGluZGl2aWR1YWxseSAoUGFuZWwgQikuIEluIFBhbmVsIEEsIHdlIGFkZGl0aW9uYWxseSBwbG90IChpbiB0dXJxdW9pc2UpIGFnZS1yZWxhdGVkIGNoYW5nZXMgaW4gYXR0cmlidXRpb25zIHRvIGluYW5pbWF0ZXMgYWZ0ZXIgZXhjbHVkaW5nIHBhcnRpY2lwYW50cyB3aG8gYXNzZXNzZWQgdGhlIHJvYm90LiBMaW5lcyBjb3JyZXNwb25kIHRvIGxpbmVhciByZWdyZXNzaW9ucyBjb25zaWRlcmluZyBjaGlsZHJlbidzIHNjb3JlcyBhbG9uZS4gRXJyb3IgYmFycyBhcmUgYm9vdHN0cmFwcGVkIDk1JSBjb25maWRlbmNlIGludGVydmFscyBvbiBhZHVsdHMnIHNjb3Jlcy4gTm90ZSB0aGF0IHRoZSByYW5nZSBvZiB0aGUgeS1heGlzIGRpZmZlcnMgYWNyb3NzIHBhbmVscy4iLCAyMzUpLCB4ID0gMCwgaGp1c3QgPSAwKQpnZ2RyYXcoZmlnMDhfd2l0aF9jYXB0aW9uKQpgYGAKCiMjIERpc2N1c3Npb24KCldlIGhhZCB0aHJlZSBnb2FscyBpbiBTdHVkeSAyOiAoMSkgVG8gdGVzdCB3aGV0aGVyIHRoZSBhZHVsdC1saWtlIGNvbmNlcHR1YWwgc3RydWN0dXJlIHJldmVhbGVkIGFtb25nIDctIHRvIDkteWVhci1vbGQgY2hpbGRyZW4gaW4gU3R1ZHkgMSB3b3VsZCBob2xkIHVuZGVyIHRoZSByYW5nZSBvZiBjb25kaXRpb25zIHRoYXQgZWxpY2l0IHRoaXMgc3RydWN0dXJlIGFtb25nIFVTIGFkdWx0cyBpbiBXZWlzbWFuIGV0IGFsLidzICgyMDE3KSBwcmV2aW91cyB3b3JrOyAoMikgVG8gZXhwbG9yZSBjb25jZXB0dWFsIHN0cnVjdHVyZSBhdCBhbiBlYXJsaWVyIHBvaW50IGluIGRldmVsb3BtZW50ICg0LTZ5KTsgYW5kICgzKSBUbyBleHBsb3JlIGFnZS1yZWxhdGVkIGRpZmZlcmVuY2VzIGluIHRoZSBfYXBwbGljYXRpb25fIG9mIGNvbmNlcHRzIG9mIG1lbnRhbCBsaWZlIGJ5IGV4YW1pbmluZyB3aGljaCBtZW50YWwgY2FwYWNpdGllcyBwYXJ0aWNpcGFudHMgb2YgZGlmZmVyZW50IGFnZXMgdGVuZGVkIHRvIGF0dHJpYnV0ZSB0byB0aGUgbmluZSB0YXJnZXQgY2hhcmFjdGVycyBpbmNsdWRlZCBpbiB0aGlzIHN0dWR5LgoKIyMjIENvbmNlcHR1YWwgc3RydWN0dXJlIGlzIHJvYnVzdCBhbW9uZyA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuCgpSZWdhcmRpbmcgb3VyIGZpcnN0IGdvYWwsIFN0dWR5IDIgc3VnZ2VzdHMgdGhhdCB0aGUgdGhyZWUtcGFydCBjb25jZXB0dWFsIHN0cnVjdHVyZeKAlGFuY2hvcmVkIGJ5IF9CT0RZXywgX0hFQVJUXywgYW5kIF9NSU5EX+KAlGlzIHJlbGlhYmxlIGFuZCByb2J1c3QgYW1vbmcgNy0gdG8gOS15ZWFyLW9sZCBVUyBjaGlsZHJlbi4gQXMgaW4gV2Vpc21hbiBldCBhbC4ncyAoMjAxNykgb3JpZ2luYWwgd29yayB3aXRoIGFkdWx0cywgdGhlIGNhcGFjaXRpZXMgdGhhdCAiaGFuZyB0b2dldGhlciIgaW4gb2xkZXIgY2hpbGRyZW4ncyByZWFzb25pbmcgd2hlbiB0YXJnZXQgY2hhcmFjYXRlcnMgYXJlIHBlcmNlaXZlZCB0byB2YXJ5IGluIG1lbnRhbCBjYXBhY2l0eSBwcm9maWxlcyBhcHBlYXIgdG8gYmUgaGlnaGx5IHNpbWlsaWFyIHRvIHRob3NlIHRoYXQgImhhbmcgdG9nZXRoZXIiIHdoZW4gcGFydGljaXBhbnRzIGRpc2FncmVlIGFib3V0IHRoZSBtZW50YWwgbGl2ZXMgb2YgY29udHJvdmVyc2lhbCAiZWRnZSBjYXNlcyIgaW4gc29jaWFsIHJlYXNvbmluZyAoU3R1ZHkgMSkuCgojIyMgQ29uY2VwdHVhbCBzdHJ1Y3R1cmUgY2hhbmdlcyBiZXR3ZWVuIDQtNnkgYW5kIDctOXkKClJlZ2FyZGluZyBvdXIgc2Vjb25kIGdvYWwsIFN0dWR5IDIgc3VnZ2VzdHMgdGhhdCB0aGlzIGNvbmNlcHR1YWwgc3RydWN0dXJlIHVuZGVyZ29lcyBzdWJzdGFudGlhbCBjaGFuZ2VzIGJldHdlZW4gZWFybHkgYW5kIG1pZGRsZSBjaGlsZGhvb2QuIExpa2Ugb2xkZXIgY2hpbGRyZW4gYW5kIGFkdWx0cywgNC0gdG8gNi15ZWFyLW9sZCBjaGlsZHJlbuKAmXMgcmVzcG9uc2VzIHdlcmUgY2hhcmFjdGVyaXplZCBieSBzdHJvbmcgY29ycmVsYXRpb25zIGFtb25nIGEgc3VpdGUgb2YgcGVyY2VwdHVhbCBhbmQgY29nbml0aXZlIGNhcGFjaXRpZXMgdGhhdCB3ZSBoYXZlIGxhYmVsZWQgX01JTkRfLiBUaGlzIGhpZ2hsaWdodHMgb25lIGFzcGVjdCBvZiBjb25jZXB0dWFsIHN0cnVjdHVyZSB0aGF0IHNlZW1zIHRvIGJlIHJlbGF0aXZlbHkgc3RhYmxlIGZyb20gZWFybHkgY2hpbGRob29kIG9ud2FyZC4gCgpIb3dldmVyLCBpbiBjb250cmFzdCB0byB0aGUgY2xlYXIgZGlzdGluY3Rpb24gYmV0d2VlbiBwaHlzaW9sb2dpY2FsIGFiaWxpdGllcyBhbmQgc29jaWFsLWVtb3Rpb25hbCBhYmlsaXRpZXMgdGhhdCBjaGFyYWN0ZXJpemVkIG1lbnRhbCBjYXBhY2l0eSBhdHRyaWJ1dGlvbnMgYW1vbmcgb2xkZXIgY2hpbGRyZW4gYW5kIGFkdWx0cywgeW91bmdlciBjaGlsZHJlbuKAmXMgcmVzcG9uc2VzIHN1Z2dlc3QgdGhhdCB0aGV5IHBlcmNlaXZlZCBwaHlzaW9sb2dpY2FsIGFuZCBzb2NpYWwtZW1vdGlvbmFsIGFiaWxpdGllcyB0byBiZSBtb3JlIGNsb3NlbHkgaW50ZWdyYXRlZCBhbmQgdGhlIGxpbmUgYmV0d2VlbiB0aGVtIHRvIGJlIG1vcmUgYmx1cnJlZC4KCmBgYHtyfQplZmFfMl9kMl80Nl9oaWdobG9hZCA8LSBsb2FkaW5nc19mdW4oZWZhXzJfZDJfNDYsICJsb25nIikgJT4lIAogIGZpbHRlcihsb2FkaW5nID49IDAuNjApICU+JQogIGFycmFuZ2UoZmFjdG9yLCBkZXNjKGxvYWRpbmcpKSAlPiUKICBncm91cF9ieShjYXBhY2l0eSkgJT4lCiAgbXV0YXRlKGFkdWx0X2ZhY3RvciA9IGNhc2Vfd2hlbigKICAgIGdyZXBsKGNhcGFjaXR5LCB0b3Bfbl9kb21DYXAoZWZhXzNfZDJfYWQsIDIwLCAiRjEiLCAicG9zIikpID09IFQgfiAiQk9EWSIsCiAgICBncmVwbChjYXBhY2l0eSwgdG9wX25fZG9tQ2FwKGVmYV8zX2QyX2FkLCAyMCwgIkYyIiwgInBvcyIpKSA9PSBUIH4gIkhFQVJUIiwKICAgIGdyZXBsKGNhcGFjaXR5LCB0b3Bfbl9kb21DYXAoZWZhXzNfZDJfYWQsIDIwLCAiRjMiLCAicG9zIikpID09IFQgfiAiTUlORCIsCiAgICBUUlVFIH4gIm5vIGRvbWluYW50IGZhY3RvciIpKSAlPiUKICB1bmdyb3VwKCkKYGBgCgpPbmUgaW5kaWNhdGlvbiBvZiB0aGlzIGJsdXJyaW5nIGNvbWVzIGZyb20gdGhlIHR3by1mYWN0b3Igc29sdXRpb24gc3VnZ2VzdGVkIGJ5IHBhcmFsbGVsIGFuYWx5c2lzLCBpbiB3aGljaCBhIHNpbmdsZSBfQk9EWS1IRUFSVF8gZmFjdG9yIGVtZXJnZWQgYW5kIHdhcyBoaWdobHkgY29uZ3J1ZW50IHdpdGggYm90aCB0aGUgX0JPRFlfIChjb3NpbmUgc2ltaWxhcml0eTogYHIgY29uZ19lZmFfMl9kMl9hZF80NlsiRjEiLCAiRjEiXWApIGFuZCBfSEVBUlRfIChgciBjb25nX2VmYV8yX2QyX2FkXzQ2WyJGMSIsICJGMiJdYCkgZmFjdG9ycyBvZiBhZHVsdHMuIEFtb25nIHRoZSBtZW50YWwgY2FwYWNpdGllcyB0aGF0IGxvYWRlZCBzdHJvbmdseSAoJFxnZXEkIDAuNjApIG9uIHRoaXMgZmFjdG9yIHdlcmUgYm90aCBwaHlzaW9sb2dpY2FsIHNlbnNhdGlvbnMgKGUuZy4sIGByIGl0YWxfYnlfY2FwX2Z1bihlZmFfMl9kMl80Nl9oaWdobG9hZCRjYXBhY2l0eVtlZmFfMl9kMl80Nl9oaWdobG9hZCRhZHVsdF9mYWN0b3I9PSJCT0RZIiAmIGVmYV8yX2QyXzQ2X2hpZ2hsb2FkJGZhY3RvciA9PSAiRjEiICYgZWZhXzJfZDJfNDZfaGlnaGxvYWQkY2FwYWNpdHkgIT0gImdldCBhbmdyeSJdKWApIGFuZCBzb2NpYWwtZW1vdGlvbmFsIGV4cGVyaWVuY2VzIChgciBpdGFsX2J5X2NhcF9mdW4oZWZhXzJfZDJfNDZfaGlnaGxvYWQkY2FwYWNpdHlbZWZhXzJfZDJfNDZfaGlnaGxvYWQkYWR1bHRfZmFjdG9yPT0iSEVBUlQiICYgZWZhXzJfZDJfNDZfaGlnaGxvYWQkZmFjdG9yID09ICJGMSJdKWApLCBzdWdnZXN0aW5nIHRoYXQgeW91bmdlciBjaGlsZHJlbiBwZXJjZWl2ZWQgcGh5c2lvbG9naWNhbCBhbmQgc29jaWFsLWVtb3Rpb25hbCBhYmlsaXRpZXMgdG8g4oCcZ28gdG9nZXRoZXLigJ0gdG8gYSBjb25zaWRlcmFibGUgZGVncmVlLgoKYGBge3J9CmVmYV8zX2QyXzQ2X2RvbUNhcCA8LSBsb2FkaW5nc19mdW4oZWZhXzNfZDJfNDYsICJsb25nIikgJT4lIAogIGFycmFuZ2UoZGVzYyhsb2FkaW5nKSkgJT4lCiAgZ3JvdXBfYnkoY2FwYWNpdHkpICU+JQogIHRvcF9uKDEsIGxvYWRpbmcpICU+JQogIG11dGF0ZShhZHVsdF9mYWN0b3IgPSBjYXNlX3doZW4oCiAgICBncmVwbChjYXBhY2l0eSwgdG9wX25fZG9tQ2FwKGVmYV8zX2QyX2FkLCAyMCwgIkYxIiwgInBvcyIpKSA9PSBUIH4gIkJPRFkiLAogICAgZ3JlcGwoY2FwYWNpdHksIHRvcF9uX2RvbUNhcChlZmFfM19kMl9hZCwgMjAsICJGMiIsICJwb3MiKSkgPT0gVCB+ICJIRUFSVCIsCiAgICBncmVwbChjYXBhY2l0eSwgdG9wX25fZG9tQ2FwKGVmYV8zX2QyX2FkLCAyMCwgIkYzIiwgInBvcyIpKSA9PSBUIH4gIk1JTkQiLAogICAgVFJVRSB+ICJubyBkb21pbmFudCBmYWN0b3IiKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGFycmFuZ2UoZmFjdG9yLCBkZXNjKGxvYWRpbmcpKQoKZWZhXzNfZDJfNDZfbG93bG9hZCA8LSBsb2FkaW5nc19mdW4oZWZhXzNfZDJfNDYsICJsb25nIikgJT4lIAogIGZpbHRlcihsb2FkaW5nIDw9IDAuNDApICU+JQogIGFycmFuZ2UoZmFjdG9yLCBkZXNjKGxvYWRpbmcpKSAlPiUKICBncm91cF9ieShmYWN0b3IsIGNhcGFjaXR5KSAlPiUKICBtdXRhdGUoYWR1bHRfZmFjdG9yID0gY2FzZV93aGVuKAogICAgZ3JlcGwoY2FwYWNpdHksIHRvcF9uX2RvbUNhcChlZmFfM19kMl9hZCwgMjAsICJGMSIsICJwb3MiKSkgPT0gVCB+ICJCT0RZIiwKICAgIGdyZXBsKGNhcGFjaXR5LCB0b3Bfbl9kb21DYXAoZWZhXzNfZDJfYWQsIDIwLCAiRjIiLCAicG9zIikpID09IFQgfiAiSEVBUlQiLAogICAgZ3JlcGwoY2FwYWNpdHksIHRvcF9uX2RvbUNhcChlZmFfM19kMl9hZCwgMjAsICJGMyIsICJwb3MiKSkgPT0gVCB+ICJNSU5EIiwKICAgIFRSVUUgfiAibm8gZG9taW5hbnQgZmFjdG9yIikpICU+JQogIHVuZ3JvdXAoKQpgYGAKCkV2ZW4gaW4gdGhlIDMtZmFjdG9yIHNvbHV0aW9uIHN1Z2dlc3RlZCBieSBXZWlzbWFuIGV0IGFsLidzICgyMDE3KSBvcmlnaW5hbCBmYWN0b3IgcmV0ZW50aW9uIHByb3RvY29sLCB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBwaHlzaW9sb2dpY2FsIGFuZCBzb2NpYWwtZW1vdGlvbmFsIGFiaWxpdGllcyB3YXMgc29tZXdoYXQgYmx1cnJlZC4gV2hpbGUgdGhlIGZpcnN0IGZhY3Rvciwgd2hpY2ggd2UndmUgbGFiZWxlZCBfQk9EWVwqXywgd2FzIGhpZ2hseSBjb25ncnVlbnQgd2l0aCBhZHVsdHMnIF9CT0RZXyBmYWN0b3IgKGNvc2luZSBzaW1pbGFyaXR5OiBgciBjb25nX2VmYV8zX2QyX2FkXzQ2WyJGMSIsICJGMSJdYCksIGl0IHdhcyBhbHNvIHRoZSBkb21pbmFudCBmYWN0b3IgZm9yIHR3byBzb2NpYWwtZW1vdGlvbmFsIGl0ZW1zIChgciBpdGFsX2J5X2NhcF9mdW4oZWZhXzNfZDJfNDZfZG9tQ2FwJGNhcGFjaXR5W2VmYV8zX2QyXzQ2X2RvbUNhcCRmYWN0b3IgPT0gIkYxIiAmIGVmYV8zX2QyXzQ2X2RvbUNhcCRhZHVsdF9mYWN0b3IgPT0gIkhFQVJUIl0pYCkuIEFuZCB3aGlsZSB0aGUgdGhpcmQgZmFjdG9yLCB3aGljaCB3ZSd2ZSBsYWJlbGVkIF9IRUFSVFwqXywgd2FzIGhpZ2hseSBjb25ncnVlbnQgd2l0aCBhZHVsdHMnIF9IRUFSVF8gZmFjdG9yIChjb3NpbmUgc2ltaWxhcml0eTogYHIgY29uZ19lZmFfM19kMl9hZF80NlsiRjMiLCAiRjIiXWApLCB0aGVyZSB3ZXJlIHNldmVyYWwgc29jaWFsLWVtb3Rpb25hbCBpdGVtcyB0aGF0IGZhaWxlZCB0byBsb2FkIHN0cm9uZ2x5IG9uIGl0IChsb2FkaW5ncyAkXGxlcSQgMC40MDogYHIgaXRhbF9ieV9jYXBfZnVuKGVmYV8zX2QyXzQ2X2xvd2xvYWQkY2FwYWNpdHlbZWZhXzNfZDJfNDZfbG93bG9hZCRmYWN0b3IgPT0gIkYzIiAmIGVmYV8zX2QyXzQ2X2xvd2xvYWQkYWR1bHRfZmFjdG9yID09ICJIRUFSVCJdKWApLiBTdGVwcGluZyBiYWNrLCBpdCBpcyBub3QgY2xlYXIgdGhhdCDigJxwaHlzaW9sb2dpY2FsIHZzLiBzb2NpYWwtZW1vdGlvbmFs4oCdIGlzIHRoZSBiZXN0IHdheSB0byBjaGFyYWN0ZXJpemUgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlc2UgdHdvIGZhY3RvcnMuIEluIGZhY3QsIGdpdmVuIHRoYXQgdGhlIHN0cm9uZ2VzdC1sb2FkaW5nIGl0ZW1zIGZvciBfQk9EWVwqXyB3ZXJlIG5lZ2F0aXZlbHkgdmFsZW5jZWQgKGByIGdzdWIoImFuZCAiLCAiIiwgdG9wX25fZG9tQ2FwKGVmYV8zX2QyXzQ2LCAzLCAiRjEiLCAiYWJzIikpYCkgd2hpbGUgdGhlIHN0cm9uZ2VzdC1sb2FkaW5nIGl0ZW1zIGZvciBfSEVBUlRcKl8gd2VyZSBwb3NpdGl2ZWx5IHZhbGVuY2VkIChgciBnc3ViKCJhbmQgIiwgIiIsIHRvcF9uX2RvbUNhcChlZmFfM19kMl80NiwgMywgIkYzIiwgImFicyIpKWApLCBpdCBzZWVtcyBwbGF1c2libGUgdGhhdCB0aGUgbW9yZSBzYWxpZW50IGRpc3RpbmN0aW9uIGFtb25nIHRoaXMgYWdlIGdyb3VwIG1heSBoYXZlIGJlZW4gcG9zaXRpdmUgdnMuIG5lZ2F0aXZlIHZhbGVuY2UsIHJhdGhlciB0aGFuIF9CT0RZXyB2cy4gX0hFQVJUXy4gVGhlIHNhbGllbmNlIG9uIG5lZ2F0aXZlIHZzLiBwb3NpdGl2ZSBleHBlcmllbmNlcyBhbW9uZyB5b3VuZ2VyIGNoaWxkcmVuIGlzIGNvbnNpc3RlbnQgd2l0aCByZWNlbnQgd29yayBvbiB0aGUgZGV2ZWxvcG1lbnQgb2YgZW1vdGlvbiBjb25jZXB0cywgd2hpY2ggc3VnZ2VzdHMgdGhhdCBlbW90aW9uIHJlcHJlc2VudGF0aW9ucyBhcmUgZG9taW5hbnRlZCBieSBhIHNpbmdsZSBkaW1lbnNpb24gb2YgdmFsZW5jZSBpbiBlYXJseSB0byBtaWRkbGUgY2hpbGRob29kLCBiZWZvcmUgdW5mb2xkaW5nIGludG8gYSB0d28tZGltZW5zaW9uYWwgc3BhY2UgY2hhcmFjdGVyaXplZCBieSB2YWxlbmNlIGFuZCBhcm91c2FsIG92ZXIgdGhlIGNvdXJzZSBvZiBsYXRlciBjaGlsZGhvb2QgYW5kIGFkb2xlc2VuY2UgKE5vb2sgZXQgYWwuLCAyMDE3KS4KCkZpbmFsbHksIHRoZSB2ZXJ5IGZhY3QgdGhhdCBkaWZmZXJlbnQgYXBwcm9hY2hlcyB0byBmYWN0b3IgcmV0ZW50aW9uIHlpZWxkZWQgZGlmZmVyZW50IHJlc3VsdHMgaXMgZnVydGhlciBldmlkZW5jZSB0aGF0LCBhbHRob3VnaCB3ZSBvYnNlcnZlZCBzb21lIGV2aWRlbmNlIGZvciBhIG5hc2NlbnQgZGlzdGluY3Rpb24gYmV0d2VlbiBfQk9EWV8gYW5kIF9IRUFSVF8gYW1vbmcgNC0gdG8gNi15ZWFyLW9sZCBjaGlsZHJlbiwgdGhpcyBkaXN0aW5jdGlvbiB3YXMgbm90IGFzIHJvYnVzdCBhcyBpdCBhcHBlYXJlZCB0byBiZSBhbW9uZyBvbGRlciBjaGlsZHJlbiBvciBhZHVsdHMuCgojIyMgRGV2ZWxvcG1lbnRhbCBjaGFuZ2VzIGluIGF0dHJpYnV0aW9ucyBvZiBhbGwgdGhyZWUgY29tcG9uZW50cyBvZiBtZW50YWwgbGlmZeKAlF9CT0RZXywgX0hFQVJUXywgYW5kIF9NSU5EX+KAlGJlZ2luIGJ5IGVhcmx5IGNoaWxkaG9vZCBhbmQgY29udGludWUgaW50byBtaWRkbGUgY2hpbGRob29kCgpSZWdhcmRpbmcgb3VyIHRoaXJkIGdvYWwsIFN0dWR5IDIgcmV2ZWFsZWQgYSB3aWRlIHZhcmlldHkgb2YgYWdlLXJlbGF0ZWQgY2hhbmdlcyBpbiBjaGlsZHJlbidzIG1lbnRhbCBjYXBhY2l0eSBhdHRyaWJ1dGlvbnMsIGluIGFsbCB0aHJlZSBhc3BlY3RzIG9mIG1lbnRhbCBsaWZlIGFzIGNvbmNlcHR1YWxpemVkIGJ5IGFkdWx0cy4gIAoKSW4gU3R1ZHkgMSwgd2Ugb2JzZXJ2ZWQgdGhhdCA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuJ3MgYXR0cmlidXRpb25zIG9mIF9IRUFSVF8gd2VyZSBwYXJ0aWN1bGFybHkgdW4tYWR1bHQtbGlrZTogQXMgYSBncm91cCwgdGhlc2UgY2hpbGRyZW4gYXR0cmlidXRlZCBtdWNoIG1vcmUgaW4gdGhlIHdheSBvZiBzb2NpYWwtZW1vdGlvbmFsIGFiaWxpdGllcyB0byBib3RoIGEgYmVldGxlIGFuZCBhIHJvYm90IHRoYW4gZGlkIGFkdWx0cyAoYWNjb3JkaW5nIHRvIGFuIGFuYWx5c2lzIG9mIGZhY3RvciBzY29yZXMsIHdpdGggY2hpbGRyZW4ncyBkYXRhIHByb2plY3RlZCBpbnRvIGFkdWx0cycgY29uY2VwdHVhbCBzcGFjZSkuIEluIHRoZSBTdHVkeSAxIHNhbXBsZSwgdGhpcyBkaWZmZXJlbmNlIGFwcGVhcmVkIHRvIGRlY2xpbmUgd2l0aCBhZ2UgYmV0d2VlbiA3LTl5LCBidXQgbmV2ZXIgcXVpdGUgcmVhY2hlZCBhZHVsdC1saWtlIGxldmVscy4KCmBgYHtyfQojIHJfZDJfNDlfcm9ib3RfSEVBUlQgPC0gYnJtKHNjb3JlIH4gYWdlLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBmdWxsX2pvaW4oCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfM19kMl80Nl9wcm9qZWN0X3Njb3JlcyAlPiUKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGNoYXJhY3RlciA9PSAicm9ib3QiLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lID09ICJIRUFSVCIpICU+JQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0X2pvaW4oZDJfNDYgJT4lIGRpc3RpbmN0KHN1YmlkLCBhZ2UpKSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV8zX2QyXzc5X3Byb2plY3Rfc2NvcmVzICU+JSAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGNoYXJhY3RlciA9PSAicm9ib3QiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWUgPT0gIkhFQVJUIikgJT4lCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRfam9pbihkMl83OSAlPiUgZGlzdGluY3Qoc3ViaWQsIGFnZSkpKSAlPiUKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShhZ2UgPSBzY2FsZShhZ2UsIHNjYWxlID0gRikpICU+JQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGluY3QoKSkKIyBzYXZlUkRTKHJfZDJfNDlfcm9ib3RfSEVBUlQsICIuL2JybXNfbW9kZWxzL3JfZDJfNDlfcm9ib3RfSEVBUlQucmRzIikKCnJfZDJfNDlfcm9ib3RfSEVBUlQgPC0gcmVhZFJEUygiLi9icm1zX21vZGVscy9yX2QyXzQ5X3JvYm90X0hFQVJULnJkcyIpCiMgc3VtbWFyeShyX2QyXzQ5X3JvYm90X0hFQVJUKQpgYGAKCkluIGxpbmUgd2l0aCB0aGlzLCBTdHVkeSAyIGFsc28gcmV2ZWFsZWQgYWdlLXJlbGF0ZWQgZGlmZmVyZW5jZXMgaW4gYXR0cmlidXRpb25zIG9mIF9IRUFSVF86IFJlbGF0aXZlIHRvIGFkdWx0cywgY2hpbGRyZW4gYWNyb3NzIHRoZSBhZ2UgcmFuZ2UgdGVuZGVkIHRvIG92ZXItYXR0cmlidXRlIHNvY2lhbC1lbW90aW9uYWwgYWJpbGl0aWVz4oCUbm90IG9ubHkgdG8gdGhlIHJvYm90IGFuZCB0aGUgYmVldGxlLCBidXQgdG8gbW9zdCBvZiB0aGUgdGFyZ2V0IGNoYXJhY3RlcnMgaW5jbHVkZWQgaW4gdGhpcyBzdHVkeSAoc2VlIEZpZ3VyZSA2KS4gQWdhaW4sIHRoaXMgdGVuZGVuY3kgZ2VuZXJhbGx5IGRlY2xpbmVkIHdpdGggYWdlLCB3aXRoIG9uZSBleGNlcHRpb246IElmIGFueXRoaW5nLCBjaGlsZHJlbidzIGF0dHJpYnV0aW9ucyBvZiBfSEVBUlRfIHRvIHJvYm90cyBhcHBlYXJlZCB0byBfaW5jcmVhc2VfIGJldHdlZW4gNC05eSBvZiBhZ2UgaW4gdGhpcyBzYW1wbGUgKHRob3VnaCBub3Qgc3Vic3RhbnRpYWxseSwgYWNjb3JkaW5nIHRvIGEgQmF5ZXNpYW4gcmVncmVzc2lvbjogYHIgd3JpdGVfYl85NUNJX2Z1bihyX2QyXzQ5X3JvYm90X0hFQVJULCAiYWdlIilgKS4gVGhlIHN1YnNldCBvZiA0LSB0byA5LXllYXItb2xkIGNoaWxkcmVuIHdobyBhc3Nlc3NlZCB0aGUgcm9ib3QgKF9uXz1gciBkMl9hbGxfY2hhciAlPiUgZmlsdGVyKGFnZV9ncm91cCAhPSAiYWR1bHRzIiwgY2hhcmFjdGVyID09ICJyb2JvdCIpICU+JSBzdW1tYXJpc2UoTiA9IHN1bShuKSkgJT4lIGFzLm51bWVyaWMoKWApIGluIFN0dWR5IDIgY29uc3RpdHV0ZWQgYSBtdWNoIHNtYWxsZXIgc2FtcGxlIHRoYW4gdGhlIGByIGQxXzc5ICU+JSBkaXN0aW5jdChzdWJpZCwgY2hhcmFjdGVyKSAlPiUgZmlsdGVyKGNoYXJhY3RlciA9PSAicm9ib3QiKSAlPiUgbnJvdygpYCA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuIHdobyBhc3Nlc3NlZCB0aGUgcm9ib3QgaW4gU3R1ZHkgMSwgc28gdGhlICJ0cnVlIiBkZXZlbG9wbWVudGFsIHRyYWplY3Rvcnkgb2YgX0hFQVJUXyBhdHRyaWJ1dGlvbnMgdG8gcm9ib3RzIHJlbWFpbnMgdW5jbGVhci4gKFdlIHJldHVybiB0byB0aGlzIHF1ZXN0aW9uIGFybWVkIHdpdGggbW9yZSBkYXRhIGZyb20gNC0gdG8gNi15ZWFyLW9sZCBjaGlsZHJlbiBpbiBTdHVkeSAzLCBhbmQgbWFrZSBmdXJ0aGVyIHJlbWFya3Mgb24gY2hpbGRyZW4ncyBhdHRyaWJ1dGlvbnMgdG8gcm9ib3RzIG1vcmUgZ2VuZXJhbGx5IGluIHRoZSBHZW5lcmFsIERpc2N1c3Npb24uKSBTZXR0aW5nIGFzaWRlIHJvYm90cyBmb3IgdGhlIG1vbWVudCwgb3VyIGdlbmVyYWwgdGFrZS1hd2F5cyBmcm9tIFN0dWRpZXMgMS0yIGFyZSB0aGF0IGNoaWRscmVuJ3MgYXR0cmlidXRpb25zIG9mIHNvY2lhbC1lbW90aW9uYWwgYWJpbGl0aWVzICh3aGF0IHdlIGNhbGwgX0hFQVJUXykgYXBwZWFyIHRvIHVuZGVyZ28gZXNwZWNpYWxseSBkcmFtYXRpYyBkZXZlbG9wbWVudGFsIGNoYW5nZXMgb3ZlciB0aGUgY291cnNlIG9mIGVhcmx5IGFuZCBtaWRkbGUgY2hpbGRob29kLiBUaGVzZSBjaGFuZ2VzIHNlZW0gdG8gYmUgZ2VuZXJhbGx5IG1vbm90b25pYyBpbiBuYXR1cmU7IHRoYXQgaXMsIHdlIHNlZSBncmFkdWFsIGRlY3JlYXNlcyBpbiBzb2NpYWwtZW1vdGlvbmFsIGF0dHJpYnV0aW9ucyBhY3Jvc3MgdGhlIGJvYXJkIGZyb20gNC05eSwgYW5kIG5vIHN0cm9uZyBldmlkZW5jZSBmb3Igbm9uLWxpbmVhcml0aWVzLiBGaW5hbGx5LCB0aGVzZSBkZXZlbG9wbWVudGFsIGNoYW5nZXMgYXBwZWFycyB0byBleHRlbmQgd2VsbCBpbnRvIG1pZGRsZSBjaGlsZGhvb2QsIGFuZCBwZXJoYXBzIGJleW9uZC4KCkJleW9uZCB0aGUgZ2VuZXJhbCBkZWNsaW5lIGluIF9IRUFSVF8gYXR0cmlidXRpb25zIHdpdGggYWdlLCB3ZSBhbHNvIG9ic2VydmVkIGFnZS1yZWxhdGVkIGRpZmZlcmVuY2VzIGluIGF0dHJpYnV0aW9ucyBvZiBib3RoIF9CT0RZXyBhbmQgZXNwZWNpYWxseSBfTUlORF8sIHdoaWNoIHdlcmUgcmV2ZWFsZWQgbW9zdCBjbGVhcmx5IHRob3J1Z2ggYW4gZXhhbWluYXRpb24gb2YgY2hpbGRyZW4ncyBtZW50YWwgY2FwYWNpdHkgYXR0cmlidXRpb25zIHRvIGFuaW1hdGUgYmVpbmdzIChiZWV0bGUsIGJpcmQsIG1vdXNlLCBnb2F0LCBlbGVwaGFudCkgdnMuIGluYW5pbWF0ZSBvYmplY3RzIChjb21wdXRlciwgcm9ib3QsIGRvbGwsIHRlZGR5IGJlYXIpLiAKCkluIHRoZSBfQk9EWV8gZG9tYWluLCBhIGRpc3RpbmN0aW9uIGJldHdlZW4gYW5pbWF0ZSBhbmQgaW5hbmltYXRlIHRhcmdldCBjaGFyYWN0ZXJzIHdhcyBjbGVhcmx5IHByZXNlbnQgZXZlbiBhbW9uZyB0aGUgeW91bmdlc3QgY2hpbGRyZW4sIGJ1dCBpbmNyZWFzZWQgZ3JhZHVhbGx5IGFjcm9zcyB0aGUgNC03eSBhZ2UgcmFuZ2UgKGFwcGVhcmluZyB0byByZWFjaCBhIGRlZ3JlZSBvZiBzZXBhcmF0aW9uIGNvbXBhcmFibGUgdG8gYWR1bHRzIHNvbWV0aW1lIGJldHdlZW4gNy05eTsgc2VlIEZpZ3VyZSA4KS4gQXMgZGVzY3JpYmVkIGFib3ZlLCB5b3VuZ2VyIGNoaWxkcmVuIGRpdmVyZ2VkIGZyb20gYWR1bHRzIHByaW1hcmlseSBpbiB0aGVpciBhdHRyaWJ1dGlvbnMgb2YgX0JPRFlfIHRvIHRoZSDigJxlZGdlIGNhc2Vz4oCdIHRoYXQgd2VyZSB0aGUgZm9jdXMgb2YgU3R1ZHkgMTogdGhlIHJvYm90IGFuZCB0aGUgYmVldGxlLiBMb29raW5nIGJhY2sgYXQgU3R1ZHkgMSwgd2Ugb2JzZXJ2ZSBhIHNpbWlsYXIsIHRob3VnaCBzdWJ0bGVyLCBwYXR0ZXJuIGV2ZW4gYW1vbmcgNy0gdG8gOS15ZWFyLW9sZCBjaGlsZHJlbiB3aGVuIHRoZSBzZXQgb2YgdGFyZ2V0IGNoYXJhY3RlcnMgd2FzIGxpbWl0ZWQgdG8gdGhlc2UgZWRnZSBjYXNlcy4gVGFrZW4gdG9nZXRoZXIsIHRoZXNlIHJlc3VsdHMgc3VnZ2VzdCB0aGF0IHdoaWxlIGJ5IHRoZSBhZ2Ugb2YgNC02eSBjaGlsZHJlbiBhcmUgcmVsYXRpdmVseSBmYXIgYWxvbmcgaW4gdGhlaXIgbWFzdGVyeSBvZiB3aGljaCBlbnRpdGllcyBpbiB0aGUgd29ybGQgYXJlIHN1YmplY3QgdG8gdGhlIHBoeXNpb2xvZ2ljYWwgc2Vuc2F0aW9ucyBvZiB0aGUgX0JPRFlfLCB0aGV5IGNvbnRpbnVlIHRvIHJlZmluZSB0aGVpciBhcHBsaWNhdGlvbiBvZiB0aGlzIGNvbmNlcHQgdGhyb3VnaG91dCBlYXJseSAoYW5kIHBlcmhhcHMgaW50byBtaWRkbGUpIGNoaWxkaG9vZC4KCkZpbmFsbHksIGluIHRoZSBfTUlORF8gZG9tYWluLCB3ZSBvYnNlcnZlZCB1bmFudGljaXBhdGVkIGFnZS1yZWxhdGVkIGRpZmZlcmVuY2VzIHRoYXQgd2VyZSBwZXJoYXBzIGV2ZW4gbW9yZSBzdHJpa2luZyB0aGFuIHRoZSBkaWZmZXJlbmNlcyBpbiB0aGUgX0hFQVJUXyBkb21haW4gZGVzY3JpYmVkIGVhcmxpZXIuIFJlbGF0aXZlIHRvIGFkdWx0cywgY2hpbGRyZW4gYWNyb3NzIHRoZSBhZ2UgcmFuZ2UgdGVuZGVkIHRvIHVuZGVyLWF0dHJpYnV0ZSBwZXJjZXB0dWFsIGFuZCBjb2duaXRpdmUgYWJpbGl0aWVzLCBib3RoIHRvIGluYW5pbWF0ZSB0YXJnZXQgY2hhcmFjdGVycyBhbmQgZXNwZWNpYWxseSB0byBhbmltYXRlIHRhcmdldCBjaGFyYWN0ZXJzLiBHZW5lcmFsbHkgc3BlYWtpbmcsIGNoaWxkcmVuJ3MgdW5kZXItYXR0cmlidXRpb25zIG9mIF9NSU5EXyBiZWNhbWUgbGVzcyBwcm9ub3VuY2VkIHdpdGggYWdl4oCUYnV0IGV2ZW4gdGhlIG9sZGVzdCBjaGlsZHJlbiBhdHRyaWJ1dGVkIGxlc3MgaW4gdGhlIHdheSBvZiBwZXJjZXB0dWFsLWNvZ25pdGl2ZSBhYmlsaXRpZXMgdG8gc3VjaCB0YXJnZXQgY2hhcmFjdGVycyBhcyB0aGUgZWxlcGhhbnQsIHRoZSBtb3VzZSwgYW5kIHRoZSBiaXJkIHRoYW4gZGlkIGFkdWx0cyAoc2VlIEZpZ3VyZSA2KS4KCiMjIyMgSW50ZXJpbSBzdW1tYXJ5CgpJbiBTdHVkaWVzIDEtMiB3ZSBkb2N1bWVudGVkIGRpZmZlcmVuY2VzIGluIHRoZSBjb25jZXB0dWFsIHN0cnVjdHVyZSB1bmRlcmx5aW5nIG1lbnRhbCBjYXBhY2l0eSBhdHRyaWJ1dGlvbnMgYmV0d2VlbiBlYXJseSBjaGlsZGhvb2QgKDQtNnkpIGFuZCBtaWRkbGUgY2hpbGRob29kICg3LTl5KSwgYXMgd2VsbCBhcyBhZ2UtcmVsYXRlZCBjaGFuZ2VzIGluIGNoaWxkcmVuJ3MgYXBwbGljYXRpb24gb2YgdGhlc2UgY29uY2VwdHPigJRpLmUuLCB0aGVpciBhdHRyaWJ1dGlvbnMgb2YgZGlmZmVyZW50IGFzcGVjdHMgb2YgbWVudGFsIGxpZmUgdG8gZGlmZmVyZW50IHRhcmdldCBjaGFyYWN0ZXJz4oCUd2hpY2ggYXBwZWFyIHRvIGJlIHVuZGVyd2F5IGJ5IGVhcmx5IGNoaWxkaG9vZCBhbmQgZXh0ZW5kIHdlbGwgaW50byBtaWRkbGUgY2hpbGRob29kIGFuZCBiZXlvbmQuIFdlIGhhdmUgaW50ZXJwcmV0ZWQgYm90aCBraW5kcyBvZiBkaWZmZXJlbmNlcyBhcyBhc3BlY3RzIG9mIF9jb25jZXB0dWFsIGRldmVsb3BtZW50XyBpbiB0aGlzIGRvbWFpbi4KCk9uZSBtYWpvciBsaW1pdGF0aW9uIG9mIFN0dWRpZXMgMS0yLCBob3dldmVyLCB3YXMgdGhhdCB0aGUgdGFzayBpbnZvbHZlZCBhIHJhdGhlciBhZHZhbmNlZCBzZXQgb2YgbWVudGFsIHN0YXRlIHZvY2FidWxhcnkgdGVybXMsIGluY2x1ZGluZyBhIHZhcmlldHkgb2YgY29tcGxleCBtZW50YWwgY2FwYWNpdGllcyAoZS5nLiwgZ3VpbHQsIHByaWRlLCBhd2FyZW5lc3MsIGRlcHRoIHBlcmNlcHRpb24pIGFuZCB1c2luZyBzb21ld2hhdCBjb21wbGljYXRlZCBzeW50YXggZm9yIHNvbWUgaXRlbXMgKGUuZy4sIF9zZW5zZSB3aGV0aGVyIHNvbWV0aGluZyBpcyBjbG9zZSBieSBvciBmYXIgYXdheV8sIF9maWd1cmUgb3V0IGhvdyB0byBkbyB0aGluZ3NfKS4gRm9yIDQtIHRvIDYteWVhci1vbGQgY2hpbGRyZW4sIGluIHBhcnRpY3VsYXIsIHNvbWUgb2YgdGhlIG1lbnRhbCBjYXBhY2l0eSBpdGVtcyBtaWdodCBoYXZlIGJlZW4gb3V0c2lkZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIHdvcmRzIHRoZXkgbm9ybWFsbHkgaGVhciBpbiBkaXNjdXNzaW9ucyBvZiBtZW50YWwgc3RhdGVz4oCUbGV0IGFsb25lIHRoZSB3b3JkcyB0aGV5IG5vcm1hbGx5IHVzZSB0aGVtc2VsdmVzLiBJbiBhZGRpdGlvbiwgeW91bmdlciBjaGlsZHJlbiBtYXkgaGF2ZSBmb3VuZCBzb21lIGFzcGVjdHMgb2YgdGhlIGV4cGVyaW1lbnRhbCBwYXJhZGlnbSBkaXN0cmFjdGluZyAoZS5nLiwgYmVpbmcgc2VhdGVkIGluIGZyb250IG9mIHRoZSBleHBlcmltZW50ZXIncyBsYXB0b3AgY29tcHV0ZXIgd2l0aG91dCBiZWluZyBhbGxvd2VkIHRvIHVzZSBpdCB0aGVtc2VsdmVzKSBvciBkaWZmaWN1bHQgKGUuZy4sIHVzaW5nIGEgdGhyZWUtcG9pbnQgc2NhbGUgd2l0aCBtaW5pbWFsIHZpc3VhbCBzY2FmZm9sZGluZzsgc2VlIFNPTSBmb3IgYW4gYW5hbHlzaXMgb2Ygc2NhbGUgdXNlIGFjcm9zcyBhZ2UgZ3JvdXBzKS4KClRodXMsIGluIG91ciBmaW5hbCBzdHVkeSwgd2UgZm9jdXNlZCBvbiA0LSB0byA2LXllYXItb2xkIGNoaWxkcmVuLCB1c2luZyBhIHNpbXBsZXIgc2V0IG9mIG1lbnRhbCBjYXBhY2l0aWVzIGFuZCBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIGV4cGVyaW1lbnRhbCBwYXJhZGlnbSAodmFsaWRhdGVkIGFtb25nIGFkdWx0cykgd2l0aCB0aGUgYWltIG9mIGdldHRpbmcgYSBjbGVhcmVyIHBpY3R1cmUgb2YgY29uY2VwdHVhbCBzdHJ1Y3R1cmUgYW5kIG1lbnRhbCBjYXBhY2l0eSBhdHRyaWJ1dGlvbnMgYXQgdGhpcyBlYXJsaWVyIHBvaW50IGluIGRldmVsb3BtZW50LgoKIyBTdHVkeSAzCgpUaGUgcHJpbWFyeSBnb2FsIG9mIFN0dWR5IDMgd2FzIHRvIHByb3ZpZGUgYSBjb25jZXB0dWFsIHJlcGxpY2F0aW9uIGFuZCBleHRlbnNpb24gb2Ygb3VyIGZpbmRpbmdzIGluIFN0dWR5IDIgdGhhdCB0aGUgY29uY2VwdHVhbCBzdHJ1Y3R1cmUgdW5kZXJseWluZyBtZW50YWwgY2FwYWNpdHkgYXR0cmlidXRpb25zIGFtb25nIDQtIHRvIDYteWVhci1vbGQgY2hpbGRyZW4gaXMgZGlmZmVyZW50IGZyb20gdGhhdCBvZiBvbGRlciBjaGlsZHJlbiBhbmQgYWR1bHRzLCBwYXJ0aWN1bGFybHkgaW4gdGVybXMgb2YgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIF9CT0RZXyBhbmQgX0hFQVJUXy4gSW4gbGlnaHQgb2Ygb3VyIGNvbmNlcm5zIGFib3V0IHZvY2FidWxhcnksIGF0dGVudGlvbiwgYW5kIHVzZSBvZiB0aGUgcmVzcG9uc2Ugc2NhbGUgYW1vbmcgNC0gdG8gNi15ZWFyLW9sZCBjaGlsZHJlbiBpbiBTdHVkeSAyLCB3ZSBkZXNpZ25lZCBhbiBldmVuIG1vcmUgY2hpbGQtZnJpZW5kbHkgdmVyc2lvbiBzcGVjaWZpY2FsbHkgdGFpbG9yZWQgdG8gYXBwcm9wcmlhdGUgZm9yIHlvdW5nIHByZXNjaG9vbGVycywgYnkgc3RyZWFtbGluaW5nIHRoZSBleHBlcmltZW50YWwgcHJvdG9jb2wsIHByb3ZpZGluZyBtb3JlIHNjYWZmb2xkaW5nIGZvciB0aGUgcmVzcG9uc2Ugc2NhbGUsIGFuZCBpbmNsdWRpbmcgb25seSB2b2NhYnVsYXJ5IGl0ZW1zIHRoYXQgd2VyZSBwcmUtdGVzdGVkIHRvIGJlIGZhbWlsaWFyIHRvIHlvdW5nIHByZXNjaG9vbCBjaGlsZHJlbiAoc2VlICJNZXRob2QiKS4gCgpBIHNlY29uZCBnb2FsIG9mIFN0dWR5IDMgd2FzIHRvIGFzc2VzcyB5b3VuZ2VyIGNoaWxkcmVuJ3MgYXR0cmlidXRpb25zIG9mIG1lbnRhbCBsaWZlIHRvIHdoYXQgd2UgaGF2ZSBjYWxsZWQgImVkZ2UgY2FzZXMiIGluIHNvY2lhbCByZWFzb25pbmc6IGEgYmVldGxlIChhbiBhdHlwaWNhbCBhbmltYWwpIGFuZCBhIHJvYm90IChhbiBhdHlwaWNhbCBvYmplY3QpLiBJbiBTdHVkaWVzIDEgYW5kIDIsIGNoaWxkcmVuIG9mIGFsbCBhZ2VzIGFwcGVhciB0byBoYXZlIGF0dHJpYnV0ZWQgbW9yZSBzb2NpYWwtZW1vdGlvbmFsIGFiaWxpdGllcyAoX0hFQVJUXykgYW5kIGZld2VyIHBlcmNlcHR1YWwtY29nbml0aXZlIGFiaWxpdGllcyAoX01JTkRfKSB0byBib3RoIG9mIHRoZXNlIGVkZ2UgY2FzZXMsIGFzIGNvbXBhcmVkIHRvIGFkdWx0cy4gSW4gU3R1ZHkgMiwgNC0gdG8gNi15ZWFyLW9sZCBjaGlsZHJlbiBhcHBlYXIgdG8gaGF2ZSBiZWVuIHBhcnRpY3VsYXJseSB1bi1hZHVsdC1saWtlIGluIHRoZWlyIGF0dHJpYnV0aW9ucyB0byB0aGUgYmVldGxlIGFuZCB0aGUgcm9ib3TigJRidXQgYmVjYXVzZSBwYXJ0aWNpcGFudHMgd2VyZSBkaXN0cmlidXRlZCBhY3Jvc3MgYSB3aWRlIHJhbmdlIG9mIHRhcmdldCBjaGFyYWN0ZXJzLCB3ZSBjb3VsZCBub3QgY2hhcnQgdGhlc2UgZGlmZmVyZW5jZXMgd2l0aCBhbnkgcHJlY2lzaW9uLiBJbiBjb250cmFzdCwgaW4gU3R1ZHkgMSB0aGUgYXBwcm9hY2ggb2YgZm9jdXNpbmcgb24gImVkZ2UgY2FzZXMiIGluIHBhcnRpY3VsYXIgYWxsb3dlZCB1cyB0byBlc3RpbWF0ZSBvbGRlciBjaGlsZHJlbidzIGFnZ3JlZ2F0ZSBhdHRyaWJ1dGlvbnMgdG8gdGhlc2UgZW50aXRpZXMgd2l0aCBwcmVjaXNpb24sIGJlY2F1c2UgbGFyZ2UgbnVtYmVycyBvZiBjaGlsZHJlbiBhc3Nlc3NlZCBlYWNoIG9mIHRoZSB0d28gdGFyZ2V0IGNoYXJhY3RlcnMuIEluIFN0dWR5IDMsIHdlIHJldHVybmVkIHRvIHRoaXMgImVkZ2UgY2FzZSIgYXBwcm9hY2gsIGxpbWl0aW5nIHRoZSB0YXJnZXQgY2hhcmFjdGVycyB0byBhIGJlZXRsZSBhbmQgYSByb2JvdC4KCiMjIE1ldGhvZAoKIyMjIFBhcnRpY2lwYW50cwoKYHIgZDNfYWQgJT4lIGRpc3RpbmN0KHN1YmlkKSAlPiUgY291bnQoKSAlPiUgYXMubnVtZXJpYygpICsgZDNfNDYgJT4lIGRpc3RpbmN0KHN1YmlkKSAlPiUgY291bnQoKSAlPiUgYXMubnVtZXJpYygpYCBwZW9wbGUgcGFydGljaXBhdGVkIGluIHRoaXMgc3R1ZHksIGluY2x1ZGluZyBhIGdyb3VwIG9mIGFkdWx0cyBhbmQgYSBncm91cCBvZiA0LSB0byA2LXllYXItb2xkIGNoaWxkcmVuLgoKYGBge3J9CiMgZGVtb2dyYXBoaWNzCmQzX2FkX2dlbmRlciA8LSBkZW1vX2Z1bihkM19hZCwgImdlbmRlciIsIDIpCmQzX2FkX2V0aG5pY2l0eSA8LSBkZW1vX2Z1bihkM19hZCwgImV0aG5pY2l0eV9jYXQiLCAyKQpgYGAKCkFkdWx0cyAoX25fPWByIGQzX2FkICU+JSBkaXN0aW5jdChzdWJpZCkgJT4lIGNvdW50KCkgJT4lIGFzLm51bWVyaWMoKWApIHBhcnRpY2lwYXRlZCB2aWEgTVR1cmsgaW4gU2VwdGVtYmVyIDIwMTguIEFkdWx0IHBhcnRpY2lwYW50cyBoYWQgZ2FpbmVkIGFwcHJvdmFsIGZvciBhdCBsZWFzdCA5NSUgb2YgdGhlaXIgcHJldmlvdXMgd29yayBvbiBNVHVyazsgaGFkIE1UdXJrIGFjY291bnRzIGJhc2VkIGluIHRoZSBVUzsgYW5kIGluZGljYXRlZCB0aGF0IHRoZXkgd2VyZSBhdCBsZWFzdCAxOCB5ZWFycyBvbGQuIEFkdWx0cyB3ZXJlIHBhaWQgXCQwLjQ1IGZvciBhcHByb3hpbWF0ZWx5IDItNCBtaW51dGVzIG9mIHRoZWlyIHRpbWUgKG1lZGlhbiBkdXJhdGlvbjogYHIgc3VtbWFyeShkM19hZCRkdXJhdGlvbilbIk1lZGlhbiJdICU+JSByb3VuZCgyKWAgbWluKS4gQW4gYWRkaXRpb25hbCAyMSBhZHVsdHMgcGFydGljaXBhdGVkIGJ1dCB3ZXJlIGV4Y2x1ZGVkIGZvciBmYWlsaW5nIHRvIHJlc3BvbmQgc2Vuc2libHkgdG8gYW4gb3Blbi1lbmRlZCBxdWVzdGlvbiBhYm91dCB3aGF0IHRoZXkgaGFkIGJlZW4gYXNrZWQgdG8gZG8gaW4gdGhlIHN0dWR5IChzZWUgU3R1ZHkgMiBmb3IgZXhhbXBsZXM7IF9uXz0xNikgb3IgZm9yIGZhaWxpbmcgdG8gcGFzcyBvbmUgb3IgbW9yZSBhdHRlbnRpb24gY2hlY2tzIChlLmcuLCAiUGxlYXNlIHNlbGVjdCBubyI7IF9uXz01KS4gQWNjb3JkaW5nIHRvIHNlbGYgcmVwb3J0LCB0aGUgZmluYWwgYWR1bHQgc2FtcGxlIHJhbmdlZCBpbiBhZ2UgZnJvbSBgciBzdW1tYXJ5KGQzX2FkJGFnZSlbIk1pbi4iXWAtYHIgc3VtbWFyeShkM19hZCRhZ2UpWyJNYXguIl1gIHllYXJzIChtZWRpYW46IGByIHN1bW1hcnkoZDNfYWQkYWdlKVsiTWVkaWFuIl1geSkgYW5kIGluY2x1ZGVkIHNsaWdodGx5IG1vcmUgbWVuIChgciByb3VuZChkM19hZF9nZW5kZXIkcHJvcFtkM19hZF9nZW5kZXIkZ2VuZGVyPT0ibSJdLCAyKSAqIDEwMGAlKSB0aGFuIHdvbWVuIChgciByb3VuZChkM19hZF9nZW5kZXIkcHJvcFtkM19hZF9nZW5kZXIkZ2VuZGVyPT0iZiJdLCAyKSAqIDEwMGAlKS4gQWR1bHRzIHByZWRvbWluYW50bHkgaWRlbnRpZmllZCBhcyBXaGl0ZSAoYHIgZDNfYWRfZXRobmljaXR5JHByb3BbZDNfYWRfZXRobmljaXR5JGV0aG5pY2l0eV9jYXQ9PSJ3aGl0ZSJdICogMTAwYCU7IGByIGQzX2FkX2V0aG5pY2l0eSRwcm9wW2QzX2FkX2V0aG5pY2l0eSRldGhuaWNpdHlfY2F0PT0iYmxhY2siXSAqIDEwMGAlIGlkZW50aWZpZWQgYXMgQmxhY2s7IGByIGQzX2FkX2V0aG5pY2l0eSRwcm9wW2QzX2FkX2V0aG5pY2l0eSRldGhuaWNpdHlfY2F0PT0ibXVsdGkiXSAqIDEwMGAlIGlkZW50aWZpZWQgYXMgbW9yZSB0aGFuIG9uZSByYWNlL2V0aG5pY2l0eSwgYW5kICRcbGVxJCBgciBkYXRhLmZyYW1lKGQzX2FkX2V0aG5pY2l0eSAlPiUgZmlsdGVyKCFldGhuaWNpdHlfY2F0ICVpbiUgYygid2hpdGUiLCAibXVsdGkiKSkpJHByb3AgJT4lIG1heCgpICogMTAwYCUgYXMgYW55IG90aGVyIHJhY2UvZXRobmljaXR5KS4KCmBgYHtyfQojIGRlbW9ncmFwaGljcwpkM180Nl9nZW5kZXIgPC0gZGVtb19mdW4oZDNfNDYsICJnZW5kZXIiLCAyKQpkM180Nl9ldGhuaWNpdHkgPC0gZGVtb19mdW4oZDNfNDYsICJldGhuaWNpdHkiLCAyKQpgYGAKCioqWFggQ0hFQ0sgV0hFTiBTQU1QTEUgSVMgQ09NUExFVEUqKjogT3VyIHBsYW5uZWQgc2FtcGxlIHNpemUgd2FzIDEwMCA0LSB0byA2LXllYXItb2xkIGNoaWxkcmVuLiBPdXIgZmluYWwgc2FtcGxlIG9mIGNoaWxkcmVuIChfbl89YHIgZDNfNDYgJT4lIGRpc3RpbmN0KHN1YmlkKSAlPiUgY291bnQoKSAlPiUgYXMubnVtZXJpYygpYCkgcmFuZ2VkIGluIGFnZSBmcm9tIGByIHN1bW1hcnkoZDNfNDYkYWdlKVsiTWluLiJdICU+JSByb3VuZCgyKSAlPiUgZm9ybWF0KG5zbWFsbCA9IDIpYC1gciBzdW1tYXJ5KGQzXzQ2JGFnZSlbIk1heC4iXSAlPiUgcm91bmQoMikgJT4lIGZvcm1hdChuc21hbGwgPSAyKWAgeWVhcnMgKG1lZGlhbjogYHIgc3VtbWFyeShkM180NiRhZ2UpWyJNZWRpYW4iXSAlPiUgcm91bmQoMikgJT4lIGZvcm1hdChuc21hbGwgPSAyKWB5KSwgYW5kIHBhcnRpY2lwYXRlZCBhdCBhIHVuaXZlcnNpdHktYWZmaWxpYXRlZCBwcmVzY2hvb2wgaW4gdGhlIEJheSBBcmVhIGJldHdlZW4gSmFudWFyeS1YWCAyMDE4LiBXZSBkaWQgbm90IHJlY29yZCBzdHVkeSBkdXJhdGlvbi4gQWNjb3JkaW5nIHRvIHNjaG9vbCByZWNvcmRzLCB0aGUgc2FtcGxlIG9mIHlvdW5nZXIgY2hpbGRyZW4gaW5jbHVkZWQgc2xpZ2h0bHkgbW9yZSBnaXJscyAoYHIgZDNfNDZfZ2VuZGVyJHByb3BbZDNfNDZfZ2VuZGVyJGdlbmRlcj09Im0iXSAqIDEwMGAlKSB0aGFuIGJveXMgKGByIGQzXzQ2X2dlbmRlciRwcm9wW2QzXzQ2X2dlbmRlciRnZW5kZXI9PSJmIl0gKiAxMDBgJSkuIENoaWxkcmVuIHdlcmUgcHJlZG9taW5hbnRseSBpZGVudGlmaWVkIGFzIFdoaXRlIChgciBkM180Nl9ldGhuaWNpdHkkcHJvcFtkM180Nl9ldGhuaWNpdHkkZXRobmljaXR5PT0id2hpdGUiXSAqIDEwMGAlKSBvciBtdWx0aXJhY2lhbCAoYHIgZDNfNDZfZXRobmljaXR5JHByb3BbZDNfNDZfZXRobmljaXR5JGV0aG5pY2l0eT09Im11bHRpIl0gKiAxMDBgJTsgJFxsZXEkIGByIGRhdGEuZnJhbWUoZDNfNDZfZXRobmljaXR5ICU+JSBmaWx0ZXIoIWV0aG5pY2l0eSAlaW4lIGMoIndoaXRlIiwgIm11bHRpIiwgIk1JU1NJTkciKSkpJHByb3AgJT4lIG1heCgpICogMTAwYCUgb2YgY2hpbGRyZW4gd2VyZSBpZGVudGlmaWVkIGFzIGFueSBvdGhlciByYWNlL2V0aG5pY2l0eSwgYW5kIGByIGQzXzQ2X2V0aG5pY2l0eSRwcm9wW2QzXzQ2X2V0aG5pY2l0eSRldGhuaWNpdHk9PSJNSVNTSU5HIl0gKiAxMDBgJSBvZiBjaGlsZHJlbidzIHBhcmVudHMgZGVjbGluZWQgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBvbiB0aGVpciByYWNlL2V0aG5pY2l0eSkuCgpBbiBhZGRpdGlvbmFsIFhYIGNoaWxkcmVuIHBhcnRpY2lwYXRlZCBidXQgd2VyZSBleGNsdWRlZCBmb3IgYmVpbmcgb3V0c2lkZSB0aGUgdGFyZ2V0IGFnZSByYW5nZXMuCgojIyMgTWF0ZXJpYWxzIGFuZCBwcm9jZWR1cmUgCgpNYXRlcmlhbHMgYW5kIHByb2NlZHVyZSB3ZXJlIGFkYXB0ZWQgdG8gYmUgbW9yZSBhcHByb3ByaWF0ZSBmb3IgeW91bmcgcHJlc2Nob29sZXJzLCB3aXRoIHR3byBwcmltYXJ5IGdvYWxzIGluIG1pbmQ6IFN0cmVhbWxpbmluZyB0aGUgZXhwZXJpbWVudGFsIHByb3RvY29sIHRvIGltcHJvdmUgY2hpbGRyZW4ncyBjb21wcmVoZW5zaW9uIGFuZCBhdHRlbnRpb24gdG8gdGhlIHRhc2ssIGFuZCBsaW1pdGluZyBtZW50YWwgY2FwYWNpdGllcyB0byB3b3JkcyB0aGF0IGFyZSBoaWdobHkgZmFtaWxpYXIgdG8geW91bmcgcHJlc2Nob29sIGNoaWxkcmVuLgoKSW4gb3JkZXIgdG8gc3RyZWFtbGluZSB0aGUgZXhwZXJpbWVudGFsIHByb3RvY29sLCB3ZSBtb3ZlZCB0aGUgdGFzayBvZmYgb2YgdGhlIGNvbXB1dGVyIChmb3IgY2hpbGRyZW4gYnV0IG5vdCBhZHVsdHMpLCBpbnN0ZWFkIHVzaW5nIHByaW50ZWQgcGhvdG9ncmFwaHMgb2YgdGhlIHRhcmdldCBjaGFyYWN0ZXJzIChtZWFzdXJpbmcgYXBwcm94aW1hdGVseSA1IHggOCBpbmNoZXMsIHByaW50ZWQgaW4gY29sb3IgYW5kIGxhbWluYXRlZCkgYW5kIHJlY29yZGluZyBjaGlsZHJlbidzIHJlc3BvbnNlcyBieSBoYW5kLiBBdCB0aGUgdGltZSBvZiB0ZXN0aW5nLCB0aGUgZXhwZXJpbWVudGVyIGFuZCBjaGlsZCBzYXQgc2lkZSBieSBzaWRlIGF0IGEgdGFibGUsIHdpdGggdGhlIHBob3RvZ3JhcGggcGxhY2VkIG9uIHRoZSB0YWJsZSBkaXJlY3RseSBpbiBmcm9udCBvZiB0aGUgY2hpbGQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgdGFzay4gCgpXZSBhbHNvIHN0cmVhbWxpbmVkIHRoZSBpbnRyb2R1Y3Rpb24gdG8gdGhlIHRhc2suIFRoZSBleHBlcmltZW50ZXIgYmVnYW4gYnkgcGxhY2luZyB0aGUgcGhvdG9ncmFwaCBvZiB0aGUgZmlyc3QgdGFyZ2V0IGNoYXJhY3RlciBpbiBmcm9udCBvZiB0aGUgY2hpbGQgYW5kIGFza2luZywgIkNhbiB5b3UgdGVsbCBtZSB3aGF0IHRoaXMgaXM/IiBJZiBhIGNoaWxkIHByb3ZpZGVkIGFuIGFuc3dlciBvdGhlciB0aGFuICJiZWV0bGUiIG9yICJyb2JvdCwiIHRoZSBleHBlcmltZW50ZXIgc2FpZCBzb21ldGhpbmcgdG8gdGhlIGVmZmVjdCBvZiwgIkknbSBnb2luZyB0byBjYWxsIGl0IGEgW2JlZXRsZS9yb2JvdF0iOyBvdGhlcndpc2UsIHRoZSBleHBlcmltZW50ZXIgYWZmaXJtZWQgdGhlIGNoaWxkJ3MgY29ycmVjdCByZXNwb25zZS4gVGhlIGV4cGVyaW1lbnRlciB0aGVuIHNhaWQsICJXZSdyZSBnb2luZyB0byBwbGF5IGEgZ2FtZSBhYm91dCBbYmVldGxlcy9yb2JvdHNdIjsgcmVtaW5kZWQgY2hpbGRyZW4sICJJZiB5b3UgZXZlciB3YW50IHRvIHN0b3AgcGxheWluZywgeW91IGNhbiBqdXN0IGxldCBtZSBrbm93IGFuZCB3ZSdsbCBnbyBiYWNrIHRvIHRoZSBjbGFzc3Jvb20iIChwZXIgdGhpcyB1bml2ZXJzaXR5IHByZXNjaG9vbCdzIHByb3RvY29sKTsgYW5kIHRoZW4gbGF1bmNoZWQgZGlyZWN0bHkgaW50byB0aGUgZmlyc3QgcXVlc3Rpb24gKGUuZy4sICJDYW4gYmVldGxlcyBnZXQgc2FkPyIpLgoKV2Ugc2NhZmZvbGRlZCBjaGlsZHJlbidzIHVzZSBvZiB0aGUgdGhyZWUtcG9pbnQgcmVzcG9uc2Ugc2NhbGUgYnkgcHJvdmlkaW5nIGEgcGh5c2ljYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNjYWxlLCBjb25zaXN0aW5nIG9mIHRocmVlIGxhcmdlIGJveGVzLCBzZXBhcmF0ZWQgYnkgYmxhbmsgc3BhY2UsIGNvbnRhaW5pbmcgdGhlIHdvcmRzICJOTywiICJLSU5EQSwiIGFuZCAiWUVTIiB3cml0dGVuIGluIGxhcmdlIGZvbnQgd2l0aCBhbGwgY2FwaXRhbCBsZXR0ZXJzICh0byBhaWQgY2hpbGRyZW4gd2l0aCBhdCBsZWFzdCBzb21lIHJlYWRpbmcgc2tpbGxzIGluIHJlY29nbml6aW5nIHRoZXNlIHdvcmRzKTsgY29sb3ItY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBpbnRlbnNpdHkgb2YgcmVzcG9uc2UgKE5PID0gdmVyeSBsaWdodCBibHVlLCBLSU5EQSA9IG1lZGl1bSBibHVlLCBZRVMgPSBkYXJrIGJsdWUpOyBhbmQgb3JkZXJlZCBmcm9tIGxlZnQgKE5PKSB0byByaWdodCAoWUVTKS4gRWFjaCBib3ggbWVhc3VyZWQgYXBwcm94aW1hdGVseSAyIHggNCBpbmNoZXM7IHRoZSBib3hlcyB3ZXJlIGxhbWluYXRlZCB3aXRoIHNsaWdodGx5IGxlc3MgdGhhbiAxIGluY2ggb2YgZW1wdHkgc3BhY2UgYmV0d2VlbiB0aGVtICh0aHJvdWdoIHdoaWNoIHRoZSB0YWJsZSB3YXMgdmlzaWJsZSkuIEluIGFkZGl0aW9uIHRvIHByb3ZpZGluZyB0aGVzZSB2aXN1YWwgYW5kIHNwYXRpYWwgY3VlcyB0byB0aGUgZmFjdCB0aGF0IHRoZXJlIHdlcmUgdGhyZWUgcmVzcG9uc2Ugb3B0aW9uc+KAlG5vLCB5ZXMsIGFuZCBzb21ldGhpbmcgY29uY2VwdHVhbGx5IGFuZCBsaXRlcmFsbHkgImluIGJldHdlZW4iIHRoZXNlIGV4dHJlbWVz4oCUd2UgYWxzbyBhZGRlZCBhIGxpbmUgdG8gdGhlIGV4cGVyaW1lbnRlcidzIHNjcmlwdCBkZXNjcmliaW5nIChhbmQgdGhlbiByZWl0ZXJhdGluZykgdGhlc2UgcmVzcG9uc2Ugb3B0aW9ucyBvbiB0aGUgZmlyc3QgdGhyZWUgdHJpYWxzICgiWW91IGNhbiBzYXkgbm8gW3BvaW50aW5nIHRvIE5PXSwga2luZGEgW3BvaW50aW5nIHRvIEtJTkRBXSwgb3IgeWVzIFtwb2ludGluZyB0byBZRVNdIikuIFRoZSBleHBlcmltZW50ZXIgcmVwZWF0ZWQgdGhlc2Ugb3B0aW9ucyBvbiB0aGUgZmlyc3QgdGhyZWUgdHJpYWxzIGZvciBhbGwgY2hpbGRyZW4sIGFuZCBvbiBhbnkgb3RoZXIgdHJpYWxzIHdoZXJlIGEgY2hpbGQgdG9vayBtb3JlIHRoYW4gYSBmZXcgc2Vjb25kcyB0byBhbnN3ZXIgb3IgcHJvdmlkZWQgYSByZXNwb25zZSBvdGhlciB0aGFuIHNheWluZyAieWVzLCIgImtpbmRhLCIgb3IgIm5vIiBvciBjbGVhcmx5IHBvaW50aW5nIHRvIG9uZSBvZiB0aGVzZSBvcHRpb25zIG9uIHRoZSByZXNwb25zZSBzY2FsZS4KCkZvciBlYWNoIG9mIHRoZSB0d28gdGFyZ2V0IGNoYXJhY3RlcnMgKGJlZXRsZSwgcm9ib3QpLCBjaGlsZHJlbiBhbnN3ZXJlZCAxOCBxdWVzdGlvbnMgYWJvdXQgaXRzIG1lbnRhbCBjYXBhY2l0aWVzLiBUaGVzZSBpdGVtcyB3ZXJlIGNob3NlbiB0byBiZSBhcyBzaG9ydCBhcyBwb3NzaWJsZSBhbmQgdG8gYmUgaGlnaGx5IGZhbWlsaWFyIHRvIHlvdW5nIHByZXNjaG9vbCBjaGlsZHJlbi4gVGhleSB3ZXJlIHNlbGVjdGVkIGZyb20gYSBsYXJnZXIgcGlsb3Qgc3R1ZHkgaW4gd2hpY2ggd2UgYXNrZWQgMy0gdG8gNS15ZWFyLW9sZCBjaGlsZHJlbiB0byBjb21wbGV0ZSBzdG9yaWVzIHRoYXQgYmVnYW4gd2l0aCBlYWNoIG9mIHRoZXNlIG1lbnRhbCBjYXBhY2l0aWVzIGFzIGEgcHJlbWlzZSAoZS5nLiwgIkxldCdzIGltYWdpbmUgYSBwZXJzb24gd2hvIF9sb3ZlcyBzb21lb25lXy4gV2hhdCBoYXBwZW5zIG5leHQ/IjsgIk5vdyBsZXQncyBwcmV0ZW5kIHRoYXQgc29tZW9uZSBfcmVtZW1iZXJzIHNvbWV0aGluZ18uIFdoYXQgaGFwcGVucyBuZXh0PyIpIGFuZCBqdWRnZWQgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB0aGVpciBzdG9yeSBjb21wbGV0aW9uLiAKCkZvciB0aGUgZmluYWwgc2V0IG9mIHF1ZXN0aW9ucywgd2UgYWltZWQgdG8gc2VsZWN0IHNpeCBjbGVhciBleGFtcGxlcyBvZiBwaHlzaW9sb2dpY2FsIHNlbnNhdGlvbnMgKF9CT0RZXyksIHNvY2lhbC1lbW90aW9uYWwgYWJpbGl0aWVzIChfSEVBUlRfKSwgYW5kIHBlcmNlcHR1YWwtY29nbml0aXZlIGNhcGFjaXRpZXMgKF9NSU5EXyksIGFjY29yZGluZyB0byBTdHVkaWVzIDEtMiBhbmQgV2Vpc21hbiBldCBhbC4ncyAoMjAxNykgb3JpZ2luYWwgc3R1ZGllcyB3aXRoIFVTIGFkdWx0cy4gV2UgcmVhc29uZWQgdGhhdCBpZiB0aGVzZSBjYXJlZnVsbHkgc2VsZWN0ZWQgZXhhbXBsZXMgb2YgX0JPRFlfLCBfSEVBUlRfLCBhbmQgX01JTkRfIHN0aWxsIGVsaWNpdGVkIGRpZmZlcmVuY2VzIGluIGNvcnJlbGF0aW9uYWwgc3RydWN0dXJlcyBiZXR3ZWVuIDQtIHRvIDYteWVhci1vbGQgY2hpbGRyZW4gYW5kIGFkdWx0cywgdGhpcyB3b3VsZCBiZSBwYXJ0aWN1bGFybHkgc3Ryb25nIGV2aWRlbmNlIG9mIGFnZS1yZWxhdGVkIGNoYW5nZXMgaW4gY29uY2VwdHVhbCBzdHJ1Y3R1cmUuCgpUaGUgZmluYWwgc2V0IG9mIF9CT0RZXyBpdGVtcyBpbmNsdWRlZCBfZmVlbCBodW5ncnlfLCBfZ2V0IHRoaXJzdHlfLCBfZmVlbCBzaWNrXywgX2ZlZWwgdGlyZWRfLCBfZ2V0IHNjYXJlZF8sIGFuZCBfc21lbGwgdGhpbmdzXy4gX0hFQVJUXyBpdGVtcyBpbmNsdWRlZCBfbG92ZSBzb21lb25lXywgX2hhdGUgc29tZW9uZV8sIF9mZWVsIGhhcHB5XywgX2dldCBzYWRfLCBfZmVlbCBzb3JyeV8sIGFuZCBfZ2V0IGxvbmVseV8uIF9NSU5EXyBpdGVtcyBpbmNsdWRlZCBfc2VlXywgX2hlYXJfLCBfdGhpbmtfLCBfcmVtZW1iZXIgdGhpbmdzXywgX2tub3cgc3R1ZmZfLCBhbmQgX2ZpZ3VyZSB0aGluZ3Mgb3V0Xy4gV2UgZW5zdXJlZCB0aGF0IGVhY2ggY2F0ZWdvcnkgaW5jbHVkZWQgYSB2YXJpZXR5IG9mIHBocmFzaW5ncyAoZS5nLiwgIl9mZWVsXyBodW5ncnkiIHZzLiAiX2dldF8gdGhpcnN0eSI7ICJyZW1lbWJlciBfdGhpbmdzXyIgdnMuICJrbm93IF9zdHVmZl8iKSBhbmQgdmFsZW5jZXMgd2hlbiBhcHByb3ByaWF0ZSAoZS5nLiwgaGFwcGluZXNzIHZzLiBzYWRuZXNzKTsgd2hlbiBwb3NzaWJsZSwgd2UgYWltZWQgdG8gaGF2ZSB0aGVzZSBhc3BlY3RzIG9mIHBocmFzaW5nIHZhcnkgb3J0aG9nb25hbGx5IHdpdGggY2F0ZWdvcmllcywgc3VjaCB0aGF0ICJnZXQiIGFuZCAiZmVlbCIgYXBwZWFyZWQgcm91Z2hseSBlcXVhbGx5IG9mdGVuIGFtb25nIHRoZSBfQk9EWV8gYW5kIF9IRUFSVF8gaXRlbXMsIGFuZCAidGhpbmdzIiBhcHBlYXJlZCBlcXVhbGx5IG9mdGVuIGFtb25nIHRoZSBfQk9EWV8gYW5kIF9NSU5EXyBpdGVtcy4gQXMgaW4gU3R1ZGllcyAxLTIsIGVhY2ggbWVudGFsIGNhcGFjaXR5IHdhcyBhc3NvY2lhdGVkIHdpdGggYSBzaG9ydCwgcHJlc2V0IGRlZmluaXRpb24sIHdoaWNoIHdhcyByZWFkIHRvIGNoaWxkcmVuIGlmIHRoZXkgZXhwcmVzc2VkIHVuY2VydGFpbnR5IGFib3V0IHdoYXQgYSB3b3JkIG1lYW50IG9yIGRpZCBub3QgcmVzcG9uZCBhZnRlciBwcm9tcHRpbmcgdXNlIG9mIHRoZSByZXNwb25zZSBzY2FsZSAoc2VlIFNPTSkuCgpDaGlsZHJlbiBmaXJzdCBhc3Nlc3NlZCBhbGwgMTggbWVudGFsIGNhcGFjaXRpZXMgZm9yIG9uZSBvZiB0aGUgdHdvIHRhcmdldCBjaGFyYWN0ZXJzIChlLmcuLCB0aGUgYmVldGxlKSwgdGhlbiBjb21wbGV0ZWQgYW4gZWFzeSBqaWdzYXcgcHV6emxlIGZlYXR1cmluZyBjbG90aGluZyBhbmQgYWNjZXNzb3JpZXMgYXBwcm9wcmlhdGUgZm9yIGEgcmFpbnkgZGF5ICh3aGljaCB0b29rIGFib3V0IDMwLTYwIHMgdG8gY29tcGxldGUpLCBhbmQgZmluYWxseSBhc3Nlc3NlZCBhbGwgMTggbWVudGFsIGNhcGFjaXRpZXMgZm9yIHRoZSBvdGhlciB0YXJnZXQgY2hhcmFjdGVyIChlLmcuLCB0aGUgcm9ib3QpLgoKVGhpcyBtb2RpZmllZCBwcm9jZWR1cmXigJRwYXJ0aWN1bGFybHkgbW92aW5nIHRoZSBleHBlcmltZW50IG9mZiBvZiB0aGUgY29tcHV0ZXIgZm9yIGNoaWxkcmVu4oCUcmVxdWlyZWQgc2V2ZXJhbCBjaGFuZ2VzIHRvIHRoZSBleHBlcmltZW50YWwgZGVzaWduLiBSYXRoZXIgdGhhbiByYW5kb21seSBhc3NpZ25pbmcgY2hpbGRyZW4gdG8gYXNzZXNzIHRoZSBiZWV0bGUgZmlyc3Qgb3IgdGhlIHJvYm90IGZpcnN0LCB0aGUgb3JkZXIgb2YgdGFyZ2V0IGNoYXJhY3RlcnMgd2FzIGNvdW50ZXJiYWxhbmNlZCBpbiBhZHZhbmNlLiBMaWtld2lzZSwgcmF0aGVyIHRoYW4gYXNraW5nIGFib3V0IHRoZSAxOCBtZW50YWwgY2FwYWNpdGllcyBpbiBhIHJhbmRvbSBvcmRlciwgcXVlc3Rpb25zIGFib3V0IHRoZSBmaXJzdCB0YXJnZXQgY2hhcmFjdGVyIHdlcmUgYXNrZWQgaW4gb25lIG9mIDggcHJlLW1hZGUgcmFuZG9tIG9yZGVycywgYW5kIHF1ZXN0aW9ucyBhYm91dCB0aGUgc2Vjb25kIHRhcmdldCBjaGFyYWN0ZXIgd2VyZSBhc2tlZCBpbiB0aGUgcmV2ZXJzZSBvcmRlci4gVGhlIG9yZGVyIG9mIHRoZSB0YXJnZXQgY2hhcmFjdGVycyAoYmVldGxlLXJvYm90IG9yIHJvYm90LWJlZXRsZSkgYW5kIHRoZSBvcmRlciBvZiB0aGUgbWVudGFsIGNhcGFjaXR5IHF1ZXN0aW9ucyAoc2VxdWVuY2VzIDEtOCkgd2VyZSBmdWxseSBjcm9zc2VkIGFjcm9zcyBwYXJ0aWNpcGFudHMuIAoKQWR1bHRzIHBhcnRpY2lwYXRlZCBpbiBhbiBvbmxpbmUgdmVyc2lvbiBvZiB0aGlzIHNhbWUgdGFzaywgd2l0aG91dCBhIGJyZWFrIGJldHdlZW4gdGFyZ2V0IGNoYXJhY3RlcnMuIEFzIGluIFN0dWRpZXMgMS0yLCBhZHVsdHMgY2xpY2tlZCB0aHJvdWdoIGEgd2Vic2l0ZSBhdCB0aGVpciBvd24gcGFjZSwgd2l0aCBvbmUgdHJpYWwgcHJlc2VudGVkIG9uIGVhY2ggcGFnZSBhbmQgbm8gYWJpbGl0eSB0byBnbyBiYWNrd2FyZHMuIAoKIyMjIERhdGEgcHJvY2Vzc2luZwoKV2UgZGlkIG5vdCByZWNvcmQgcmVzcG9uc2UgdGltZXMgb3IgdXNlIHRoaXMgYXMgYSBjcml0ZXJpb24gZm9yIGluY2x1c2lvbi4gQXMgaW4gU3R1ZGllcyAxLTIsIHdlIHJldGFpbmVkIHBhcnRpY2lwYW50cyByZWdhcmRsZXNzIG9mIHNraXBwZWQgdHJpYWxzIChfbl89WFggdHJpYWxzIGFtb25nIGNoaWxkcmVuOyBYWCUgb2YgYWxsIHRyaWFscykuCgpGb2xsb3dpbmcgV2Vpc21hbiBldCBhbC4gKDIwMTcsIFN0dWR5IDQpLCBmb3Igb3VyIGV4cGxvcmF0b3J5IGZhY3RvciBhbmFseXNlcyB3ZSB0cmVhdGVkIGVhY2ggcGFydGljaXBhbnQncyBhc3Nlc3NtZW50cyBvZiBlYWNoIHRhcmdldCBjaGFyYWN0ZXIgYXMgYSBzZXBhcmF0ZSBzZXQgb2Ygb2JzZXJ2YXRpb25zIChhcyBpZiB0aGV5IGNhbWUgZnJvbSBkaWZmZXJlbnQgcGFydGljaXBhbnRzKS4gVGhpcyBlZmZlY3RpdmVseSBkb3VibGVkIG91ciBzYW1wbGUgc2l6ZSB0byBgciBucm93KGQzX2FkKWAgYWR1bHRzIGFuZCBgciBucm93KGQzXzQ2KWAgY2hpbGRyZW4uIChTZWUgU09NIGZvciBzZXBhcmF0ZSBFRkFzIG9mIHRoZSBwYXJ0aWNpcGFudHMnIHJlc3BvbnNlcyB0byB0aGUgZmlyc3QgdGFyZ2V0IGNoYXJhY3RlciB0aGF0IHRoZXkgd2VyZSBhc3NpZ25lZCB0byByYXRlIHZzLiB0aGUgc2Vjb25kIGNoYXJhY3Rlci4pCgojIyBSZXN1bHRzCgojIyMgQ29uY2VwdHVhbCBzdHJ1Y3R1cmU6IEFkdWx0cwoKYGBge3J9CiMgaW1wbGVtZW50IDMgZmFjdG9yIHJldGVudGlvbiBwcm90b2NvbHMKbmZhY3RfcGFyX2QzX2FkIDwtIGZhLnBhcmFsbGVsKGQzX2FkX3dpZGVfaSwgY29yID0gY2hvc2VuX2NvciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbSA9IGNob3Nlbl9mbSwgcGxvdCA9IEYpJG5mYWN0Cm5mYWN0X2JpY19kM19hZCA8LSB2c3MoZDNfYWRfd2lkZV9pLCBjb3IgPSBjaG9zZW5fY29yLCByb3RhdGUgPSBjaG9zZW5fcm90LCAKICAgICAgICAgICAgICAgICAgICAgICBmbSA9IGNob3Nlbl9mbSwgcGxvdCA9IEYpJHZzcy5zdGF0cyRCSUMgJT4lIHdoaWNoLm1pbigpCm5mYWN0X3dkbV9kM19hZCA8LSByZXRlbl9mdW4oZDNfYWRfd2lkZV9pLCByb3RfdHlwZSA9IGNob3Nlbl9yb3QpCgpjYXQoIlBhcmFsbGVsIGFuYWx5c2lzOiAiLCBuZmFjdF9wYXJfZDNfYWQsCiAgICAiXG5NaW5pbWl6aW5nIEJJQzogIiwgbmZhY3RfYmljX2QzX2FkLAogICAgIlxuV2Vpc21hbiBldCBhbC46ICIsIG5mYWN0X3dkbV9kM19hZCkKYGBgCgpgYGB7cn0KZWZhXzRfZDNfYWQgPC0gZmFfZnVuKGQzX2FkX3dpZGVfaSwgNCkKYGBgCgpBbGwgb2Ygb3VyIGZhY3RvciByZXRlbnRpb24gcHJvdG9jb2xzIHN1Z2dlc3RlZCByZXRhaW5pbmcgdGhyZWUgZmFjdG9ycy4KCmBgYHtyfQplZmFfM19kM19hZCA8LSBmYV9mdW4oZDNfYWRfd2lkZV9pLCAzKQplZmFfM19wbG90X2QzX2FkIDwtIGhlYXRtYXBfZnVuKGVmYV8zX2QzX2FkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBjKCJCT0RZIiwgIkhFQVJUIiwgIk1JTkQiKSkgKwogIGxhYnModGl0bGUgPSBwYXN0ZTAoIkFkdWx0cyIpKQpgYGAKCkFzIGV4cGVjdGVkLCB0aGUgY29uY2VwdHVhbCBzdHJ1Y3R1cmUgcmV2ZWFsZWQgYnkgdGhpcyBhbmFseXNpcyBhbW9uZyBhZHVsdHMgd2FzIGNoYXJhY3Rlcml6ZWQgYnkgYSB0aHJlZS13YXkgZGlzdGluY3Rpb24gYmV0d2VlbiBfQk9EWV8gKGZpcnN0IGZhY3RvciwgYHIgcm91bmQoZWZhXzNfZDNfYWQkVmFjY291bnRlZFsiUHJvcG9ydGlvbiBFeHBsYWluZWQiLCAiRjEiXSwgMikgKiAxMDBgJSBvZiB0aGUgc2hhcmVkIHZhcmlhbmNlIGluIHRoZSByb3RhdGVkIHRocmVlLWZhY3RvciBzb2x1dGlvbiksIF9IRUFSVF8gKHNlY29uZCBmYWN0b3IsIGByIHJvdW5kKGVmYV8zX2QzX2FkJFZhY2NvdW50ZWRbIlByb3BvcnRpb24gRXhwbGFpbmVkIiwgIkYyIl0sIDIpICogMTAwYCUgb2Ygc2hhcmVkIHZhcmlhbmNlKSwgYW5kIF9NSU5EXyAodGhpcmQgZmFjdG9yLCBgciByb3VuZChlZmFfM19kM19hZCRWYWNjb3VudGVkWyJQcm9wb3J0aW9uIEV4cGxhaW5lZCIsICJGMyJdLCAyKSAqIDEwMGAlIG9mIHNoYXJlZCB2YXJpYW5jZSkuIFNlZSBGaWd1cmUgOSwgUGFuZWwgQy4KClRoaXMgc3VnZ2VzdHMgdGhhdCBvdXIgbW9kaWZpZWQgcHJlc2Nob29sZXItZnJpZW5kbHkgcGFyYWRpZ20gd2FzIHZhbGlkOiBVc2luZyBzaW1wbGVyIHZvY2FidWxhcnkgYW5kIGEgd2l0aGluLXN1YmplY3RzIGFwcHJvYWNoIHRvIHRhZ2V0IGNoYXJhY3RlcnMgZWxpY2l0ZWQgdGhlIHNhbWUgaW50dWl0aXZlIG9udG9sb2d5IG9mIG1lbnRhbCBsaWZlLCBhbW9uZyBVUyBhZHVsdHMsIHRoYXQgd2FzIHJldmVhbGVkIGluIFN0dWRpZXMgMS0yIGFuZCBpbiBXZWlzbWFuIGV0IGFsLidzICgyMDE3KSBwcmV2aW91cyB3b3JrLiAKCiMjIyBDb25jZXB0dWFsIHN0cnVjdHVyZTogQ2hpbGRyZW4gKDQtNnkpCgpgYGB7cn0KIyBpbXBsZW1lbnQgMyBmYWN0b3IgcmV0ZW50aW9uIHByb3RvY29scwpuZmFjdF9wYXJfZDNfNDYgPC0gZmEucGFyYWxsZWwoZDNfNDZfd2lkZV9pLCBjb3IgPSBjaG9zZW5fY29yLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtID0gY2hvc2VuX2ZtLCBwbG90ID0gRikkbmZhY3QKbmZhY3RfYmljX2QzXzQ2IDwtIHZzcyhkM180Nl93aWRlX2ksIGNvciA9IGNob3Nlbl9jb3IsIHJvdGF0ZSA9IGNob3Nlbl9yb3QsIAogICAgICAgICAgICAgICAgICAgICAgIGZtID0gY2hvc2VuX2ZtLCBwbG90ID0gRikkdnNzLnN0YXRzJEJJQyAlPiUgd2hpY2gubWluKCkKbmZhY3Rfd2RtX2QzXzQ2IDwtIHJldGVuX2Z1bihkM180Nl93aWRlX2ksIHJvdF90eXBlID0gY2hvc2VuX3JvdCkKCmNhdCgiUGFyYWxsZWwgYW5hbHlzaXM6ICIsIG5mYWN0X3Bhcl9kM180NiwKICAgICJcbk1pbmltaXppbmcgQklDOiAiLCBuZmFjdF9iaWNfZDNfNDYsCiAgICAiXG5XZWlzbWFuIGV0IGFsLjogIiwgbmZhY3Rfd2RtX2QzXzQ2KQpgYGAKCmBgYHtyfQplZmFfMV9kM180NiA8LSBmYV9mdW4oZDNfNDZfd2lkZV9pLCAxKQpgYGAKCkFzIGluIFN0dWR5IDIsIG91ciB0aHJlZSBtZXRob2RzIGZvciBkZXRlcm1pbmluZyBob3cgbWFueSBmYWN0b3JzIHRvIHJldGFpbiBlYWNoIHN1Z2dlc3RlZCByZXRhaW5pbmcgZGlmZmVyZW50IG51bWJlcnMgb2YgZmFjdG9yczogSW4gdGhpcyBjYXNlLCBXZWlzbWFuIGV0IGFsLidzIGZhY3RvciByZXRlbnRpb24gY3JpdGVyaWEgc3VnZ2VzdGVkIHJldGFpbmluZyBgciBuZmFjdF93ZG1fZDNfNDZgIGZhY3RvcnMsIHBhcmFsbGVsIGFuYWx5c2lzIHN1Z2dlc3RlZCByZXRhaW5pbmcgYHIgbmZhY3RfcGFyX2QzXzQ2YCBmYWN0b3JzLCBhbmQgbWluaW1pemluZyBCSUMgc3VnZ2VzdGVkIGEgbnVsbCwgYHIgbmZhY3RfYmljX2QzXzQ2YC1mYWN0b3Igc29sdXRpb24uIEhlcmUgd2UgcHJlc2VudCBib3RoIHRoZSBmb3VyLSBhbmQgdGhyZWUtZmFjdG9yIHNvbHV0aW9ucy4gKFNlZSBTT00gZm9yIGZhY3RvciBsb2FkaW5ncyBvbiB0aGUgb25lICJmYWN0b3IiIGluIHRoZSBudWxsLCBvbmUtZmFjdG9yIHNvbHV0aW9uLCB3aGljaOKAlGFzIGluIFN0dWR5IDLigJR5aWVsZGVkIHBhcnRpY3VsYXJseSBzdHJvbmcgbG9hZGluZ3MgZm9yIHNvY2lhbC1lbW90aW9uYWwgZXhwZXJpZW5jZXMgYW5kIHBoeXNpb2xvZ2ljYWwgc2Vuc2F0aW9ucywgc3VjaCBhcyBgciB0b3Bfbl9kb21DYXAoZWZhXzFfZDNfNDYsIDQsICJGMSIpYC4pCgojIyMjIEZvdXItZmFjdG9yIHNvbHV0aW9uCgpgYGB7cn0KZWZhXzRfZDNfNDYgPC0gZmFfZnVuKGQzXzQ2X3dpZGVfaSwgNCkKCmVmYV80X3Bsb3RfZDNfNDYgPC0gaGVhdG1hcF9mdW4oZWZhXzRfZDNfNDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gYygiTUlORCoiLCAiQk9EWSBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQk9EWSBJSSIsICJIRUFSVCoiKSkgKwogIGxhYnModGl0bGUgPSBwYXN0ZTAoIkNoaWxkcmVuICg0LTZ5KTogNC1mYWN0b3Igc29sdXRpb24iKSkgKwogIGd1aWRlcyhmaWxsID0gIm5vbmUiKQpgYGAKCmBgYHtyfQpjb25nX2VmYV80X2QzX2FkXzQ2IDwtIGZhLmNvbmdydWVuY2UoZWZhXzRfZDNfNDYkbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfM19kM19hZCRsb2FkaW5ncykKYGBgCgpJbiB0aGUgcm90YXRlZCBmb3VyLWZhY3RvciBzb2x1dGlvbiBzdWdnZXN0ZWQgYnkgV2Vpc21hbiBldCBhbC4ncyByZXRlbnRpb24gY3JpdGVyaWEsIHRoZSBmaXJzdCBmYWN0b3IgY29ycmVzcG9uZGVkIHByaW1hcmlseSB0byBwZXJjZXB0dWFsLWNvZ25pdGl2ZSBhYmlsaXRpZXMsIGFzIHdlbGwgYXMgc29tZSBwb3NpdGl2ZSBlbW90aW9ucy4gQW4gYW5hbHlzaXMgb2YgZmFjdG9yIGNvbmdydWVuY2UgY29uZmlybWVkIHRoYXQgdGhpcyBmYWN0b3Igd2FzIG1vc3Qgc2ltaWxhciB0byBhZHVsdHMnIF9NSU5EXyBmYWN0b3IgKGNvc2luZSBzaW1pbGFyaXR5IHdpdGggX01JTkRfOiBgciBjb25nX2VmYV80X2QzX2FkXzQ2WyJGMSIsICJGMyJdYDsgd2l0aCBfSEVBUlRfOiBgciBjb25nX2VmYV80X2QzX2FkXzQ2WyJGMSIsICJGMiJdYDsgd2l0aCBfQk9EWV86IGByIGNvbmdfZWZhXzRfZDNfYWRfNDZbIkYxIiwgIkYxIl1gKS4gSXQgd2FzIHRoZSBkb21pbmFudCBmYWN0b3IgZm9yIHN1Y2ggaXRlbXMgYXMgYHIgdG9wX25fZG9tQ2FwKGVmYV80X2QzXzQ2LCA0LCAiRjEiLCAicG9zIilgLCBhbmQgYWNjb3VudGVkIGZvciBgciByb3VuZChlZmFfNF9kM180NiRWYWNjb3VudGVkWyJQcm9wb3J0aW9uIEV4cGxhaW5lZCIsICJGMSJdLCAyKSAqIDEwMGAlIG9mIHRoZSBzaGFyZWQgdmFyaWFuY2UgaW4gdGhlIHJvdGF0ZWQgZm91ci1mYWN0b3Igc29sdXRpb24uIAoKVGhlIHNlY29uZCBmYWN0b3IgY29ycmVzcG9uZGVkIHByaW1hcmlseSB0byBwaHlzaW9sb2dpY2FsIHNlbnNhdGlvbnMsIGFzIHdlbGwgYXMgb25lIG5lZ2F0aXZlIGVtb3Rpb24gKF9nZXQgc2FkXykuIEFuIGFuYWx5c2lzIG9mIGZhY3RvciBjb25ncnVlbmNlIGluZGljYXRlZCB0aGF0IHRoaXMgZmFjdG9yIHdhcyBtb3N0IHNpbWlsYXIgdG8gYWR1bHRzJyBfQk9EWV8gZmFjdG9yIChjb3NpbmUgc2ltaWxhcml0eSB3aXRoIF9CT0RZXzogYHIgY29uZ19lZmFfNF9kM19hZF80NlsiRjIiLCAiRjEiXWA7IHdpdGggX0hFQVJUXzogYHIgY29uZ19lZmFfNF9kM19hZF80NlsiRjIiLCAiRjIiXWA7IHdpdGggX01JTkRfOiBgciBjb25nX2VmYV80X2QzX2FkXzQ2WyJGMiIsICJGMyJdYCkuIEl0IHdhcyB0aGUgZG9taW5hbnQgZmFjdG9yIGZvciBzdWNoIGl0ZW1zIGFzIGByIHRvcF9uX2RvbUNhcChlZmFfNF9kM180NiwgNCwgIkYxIiwgInBvcyIpYCwgYW5kIGFjY291bnRlZCBmb3IgYHIgcm91bmQoZWZhXzRfZDNfNDYkVmFjY291bnRlZFsiUHJvcG9ydGlvbiBFeHBsYWluZWQiLCAiRjEiXSwgMikgKiAxMDBgJSBvZiB0aGUgc2hhcmVkIHZhcmlhbmNlIGluIHRoZSByb3RhdGVkIGZvdXItZmFjdG9yIHNvbHV0aW9uLiAKClRoZSB0aGlyZCBmYWN0b3IgYWxzbyBjb3JyZXNwb25kZWQgdG8gcGh5c2lvbG9naWNhbCBzZW5zYXRpb25zLCBhcyB3ZWxsIGFzIG9uZSBwZXJjZXB0dWFsIGFiaWxpdHkgKF9zZWVfKS4gQW4gYW5hbHlzaXMgb2YgZmFjdG9yIGNvbmdydWVuY2UgaW5kaWNhdGVkIHRoYXQgdGhpcyBmYWN0b3Igd2FzIG1vc3Qgc2ltaWxhciB0byBhZHVsdHMnIF9CT0RZXyBmYWN0b3IgKGNvc2luZSBzaW1pbGFyaXR5IHdpdGggX0JPRFlfOiBgciBjb25nX2VmYV80X2QzX2FkXzQ2WyJGMyIsICJGMSJdYDsgd2l0aCBfSEVBUlRfOiBgciBjb25nX2VmYV80X2QzX2FkXzQ2WyJGMyIsICJGMiJdYDsgd2l0aCBfTUlORF86IGByIGNvbmdfZWZhXzRfZDNfYWRfNDZbIkYzIiwgIkYzIl1gKS4gSXQgd2FzIHRoZSBkb21pbmFudCBmYWN0b3IgZm9yIHN1Y2ggaXRlbXMgYXMgYHIgdG9wX25fZG9tQ2FwKGVmYV80X2QzXzQ2LCA0LCAiRjEiLCAicG9zIilgLCBhbmQgYWNjb3VudGVkIGZvciBgciByb3VuZChlZmFfNF9kM180NiRWYWNjb3VudGVkWyJQcm9wb3J0aW9uIEV4cGxhaW5lZCIsICJGMSJdLCAyKSAqIDEwMGAlIG9mIHRoZSBzaGFyZWQgdmFyaWFuY2UgaW4gdGhlIHJvdGF0ZWQgZm91ci1mYWN0b3Igc29sdXRpb24uIAoKRmluYWxseSwgdGhlIGZvdXJ0aCBmYWN0b3IgY29ycmVzcG9uZGVkIHByaW1hcmlseSB0byBzb2NpYWwtZW1vdGlvbmFsIGFiaWxpdGllcywgd2l0aCBwYXJ0aWN1bGFybHkgc3Ryb25nIGxvYWRpbmdzIGZvciBuZWdhdGl2ZSBlbW90aW9ucy4gQW4gYW5hbHlzaXMgb2YgZmFjdG9yIGNvbmdydWVuY2UgaW5kaWNhdGVkIHRoYXQgdGhpcyBmYWN0b3Igd2FzIG1vc3Qgc2ltaWxhciB0byBhZHVsdHMnIF9IRUFSVF8gZmFjdG9yIChjb3NpbmUgc2ltaWxhcml0eSB3aXRoIF9IRUFSVF86IGByIGNvbmdfZWZhXzRfZDNfYWRfNDZbIkY0IiwgIkYyIl1gOyB3aXRoIF9CT0RZXzogYHIgY29uZ19lZmFfNF9kM19hZF80NlsiRjQiLCAiRjEiXWA7IHdpdGggX01JTkRfOiBgciBjb25nX2VmYV80X2QzX2FkXzQ2WyJGNCIsICJGMyJdYCkuIEl0IHdhcyB0aGUgZG9taW5hbnQgZmFjdG9yIGZvciBzdWNoIGl0ZW1zIGFzIGByIHRvcF9uX2RvbUNhcChlZmFfNF9kM180NiwgNCwgIkYzIiwgInBvcyIpYCwgYW5kIGFjY291bnRlZCBmb3IgYHIgcm91bmQoZWZhXzRfZDNfNDYkVmFjY291bnRlZFsiUHJvcG9ydGlvbiBFeHBsYWluZWQiLCAiRjMiXSwgMikgKiAxMDBgJSBvZiB0aGUgc2hhcmVkIHZhcmlhbmNlIGluIHRoZSByb3RhdGVkIGZvdXItZmFjdG9yIHNvbHV0aW9uLiAoU2VlIEZpZ3VyZSA5LCBQYW5lbCBBLCBmb3IgYWxsIGZhY3RvciBsb2FkaW5ncy4pCgpBcyBpbiBTdHVkeSAxLCB3ZSB3b3VsZCBkZXNjcmliZSB0aGlzIGNvbmNlcHR1YWwgc3RydWN0dXJlIGFzIHJlbWluaXNjZW50IG9mIHRoZSBfQk9EWV8tX0hFQVJUXy1fTUlORF8gc3RydWN0dXJlIGZvdW5kIGFtb25nIG9sZGVyIGNoaWxkcmVuIGFuZCBhZHVsdHMsIGJ1dCBub3QgYXMgZnVsbHkgImFkdWx0LWxpa2UuIiBJbiBwYXJ0aWN1bGFyLCBpbiB0aGlzIHN0cnVjdHVyZSwgdGhlIHNvY2lhbC1lbW90aW9uYWwgYWJpbGl0aWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgX0hFQVJUXyBhbW9uZyBvbGRlciBjaGlsZHJlbiBhbmQgYWR1bHRzIGFyZSBub3QgYXMgY2xlYXJseSBkaWZmZXJlbnRpYXRlZCBmcm9tIGVpdGhlciB0aGUgcGh5c2lvbG9naWNhbCBzZW5zYXRpb25zIG9mIHRoZSBfQk9EWV8gb3IgdGhlIHBlcmNlcHR1YWwtY29nbml0aXZlIGFiaWxpdGllcyBvZiB0aGUgX01JTkRfLiBNb3Jlb3ZlcuKAlGluIGEgZGl2ZXJnZW5jZSBmcm9tIFN0dWR5IDLigJRpbiB0aGlzIGNhc2UgdGhlIHBoeXNpb2xvZ2ljYWwgc2Vuc2F0aW9ucyBvZiB0aGUgX0JPRFlfIGFyZSBzcGxpdCBhY3Jvc3MgdHdvIGZhY3RvcnMuIAoKIyMjIyBUaHJlZS1mYWN0b3Igc29sdXRpb24KCmBgYHtyfQplZmFfM19kM180NiA8LSBmYV9mdW4oZDNfNDZfd2lkZV9pLCAzKQoKZWZhXzNfcGxvdF9kM180NiA8LSBoZWF0bWFwX2Z1bihlZmFfM19kM180NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBjKCJCT0RZIiwgIk1JTkQqIiwgIkhFQVJUKiIpKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlMCgiQ2hpbGRyZW4gKDQtNnkpOiAzLWZhY3RvciBzb2x1dGlvbiIpKSArCiAgZ3VpZGVzKGZpbGwgPSAibm9uZSIpCmBgYAoKYGBge3J9CmNvbmdfZWZhXzNfZDNfYWRfNDYgPC0gZmEuY29uZ3J1ZW5jZShlZmFfM19kM180NiRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV8zX2QzX2FkJGxvYWRpbmdzKQpgYGAKCkluIHRoZSByb3RhdGVkIHRocmVlLWZhY3RvciBzb2x1dGlvbiBzdWdnZXN0ZWQgYnkgcGFyYWxsZWwgYW5hbHlzaXMsIHRoZSBmaXJzdCBjb3JyZXNwb25kZWQgcHJpbWFyaWx5IHRvIHBoeXNpb2xvZ2ljYWwgc2Vuc2F0aW9ucy4gQW4gYW5hbHlzaXMgb2YgZmFjdG9yIGNvbmdydWVuY2UgaW5kaWNhdGVkIHRoYXQgdGhpcyBmYWN0b3Igd2FzIG1vc3Qgc2ltaWxhciB0byBhZHVsdHMnIF9CT0RZXyBmYWN0b3IgKGNvc2luZSBzaW1pbGFyaXR5IHdpdGggX0JPRFlfOiBgciBjb25nX2VmYV8zX2QzX2FkXzQ2WyJGMSIsICJGMSJdYDsgd2l0aCBfSEVBUlRfOiBgciBjb25nX2VmYV8zX2QzX2FkXzQ2WyJGMSIsICJGMiJdYDsgd2l0aCBfTUlORF86IGByIGNvbmdfZWZhXzNfZDNfYWRfNDZbIkYxIiwgIkYzIl1gKS4gSXQgd2FzIHRoZSBkb21pbmFudCBmYWN0b3IgZm9yIHN1Y2ggaXRlbXMgYXMgYHIgdG9wX25fZG9tQ2FwKGVmYV8zX2QzXzQ2LCA0LCAiRjEiLCAicG9zIilgLCBhbmQgYWNjb3VudGVkIGZvciBgciByb3VuZChlZmFfM19kM180NiRWYWNjb3VudGVkWyJQcm9wb3J0aW9uIEV4cGxhaW5lZCIsICJGMSJdLCAyKSAqIDEwMGAlIG9mIHRoZSBzaGFyZWQgdmFyaWFuY2UgaW4gdGhlIHJvdGF0ZWQgdGhyZWUtZmFjdG9yIHNvbHV0aW9uLiAKClRoZSBzZWNvbmQgZmFjdG9yIGNvcnJlc3BvbmRlZCBwcmltYXJpbHkgdG8gcGVyY2VwdHVhbC1jb2duaXRpdmUgYWJpbGl0aWVzLCBhcyB3ZWxsIGFzIG9uZSBwb3NpdGl2ZSBlbW90aW9uIChfZmVlbCBoYXBweV8pLiBBbiBhbmFseXNpcyBvZiBmYWN0b3IgY29uZ3J1ZW5jZSBjb25maXJtZWQgdGhhdCB0aGlzIGZhY3RvciB3YXMgbW9zdCBzaW1pbGFyIHRvIGFkdWx0cycgX01JTkRfIGZhY3RvciAoY29zaW5lIHNpbWlsYXJpdHkgd2l0aCBfTUlORF86IGByIGNvbmdfZWZhXzNfZDNfYWRfNDZbIkYyIiwgIkYzIl1gOyB3aXRoIF9IRUFSVF86IGByIGNvbmdfZWZhXzNfZDNfYWRfNDZbIkYyIiwgIkYyIl1gOyB3aXRoIF9CT0RZXzogYHIgY29uZ19lZmFfM19kM19hZF80NlsiRjIiLCAiRjEiXWApLiBJdCB3YXMgdGhlIGRvbWluYW50IGZhY3RvciBmb3Igc3VjaCBpdGVtcyBhcyBgciB0b3Bfbl9kb21DYXAoZWZhXzNfZDNfNDYsIDQsICJGMiIsICJwb3MiKWAsIGFuZCBhY2NvdW50ZWQgZm9yIGByIHJvdW5kKGVmYV8zX2QzXzQ2JFZhY2NvdW50ZWRbIlByb3BvcnRpb24gRXhwbGFpbmVkIiwgIkYyIl0sIDIpICogMTAwYCUgb2YgdGhlIHNoYXJlZCB2YXJpYW5jZSBpbiB0aGUgcm90YXRlZCB0aHJlZS1mYWN0b3Igc29sdXRpb24uCgpUaGUgdGhpcmQgZmFjdG9yIGNvcnJlc3BvbmRlZCBwcmltYXJpbHkgdG8gc29jaWFsLWVtb3Rpb25hbCBhYmlsaXRpZXMsIGFzIHdlbGwgYXMgb25lIHBvc2l0aXZlIGVtb3Rpb24gKF9mZWVsIGhhcHB5XykuIEFuIGFuYWx5c2lzIG9mIGZhY3RvciBjb25ncnVlbmNlIGNvbmZpcm1lZCB0aGF0IHRoaXMgZmFjdG9yIHdhcyBtb3N0IHNpbWlsYXIgdG8gYWR1bHRzJyBfSEVBUlRfIGZhY3RvciAoY29zaW5lIHNpbWlsYXJpdHkgd2l0aCBfTUlORF86IGByIGNvbmdfZWZhXzNfZDNfYWRfNDZbIkYzIiwgIkYyIl1gOyB3aXRoIF9CT0RZXzogYHIgY29uZ19lZmFfM19kM19hZF80NlsiRjMiLCAiRjEiXWA7IHdpdGggX01JTkRfOiBgciBjb25nX2VmYV8zX2QzX2FkXzQ2WyJGMyIsICJGMyJdYCkuIEl0IHdhcyB0aGUgZG9taW5hbnQgZmFjdG9yIGZvciBzdWNoIGl0ZW1zIGFzIGByIHRvcF9uX2RvbUNhcChlZmFfM19kM180NiwgNCwgIkYyIiwgInBvcyIpYCwgYW5kIGFjY291bnRlZCBmb3IgYHIgcm91bmQoZWZhXzNfZDNfNDYkVmFjY291bnRlZFsiUHJvcG9ydGlvbiBFeHBsYWluZWQiLCAiRjIiXSwgMikgKiAxMDBgJSBvZiB0aGUgc2hhcmVkIHZhcmlhbmNlIGluIHRoZSByb3RhdGVkIHRocmVlLWZhY3RvciBzb2x1dGlvbi4gKFNlZSBGaWd1cmUgOSwgUGFuZWwgQiwgZm9yIGFsbCBmYWN0b3IgbG9hZGluZ3MuKQoKSW4gcmVsYXRpb24gdG8gdGhlIF9CT0RZXy1fSEVBUlRfLV9NSU5EXyBzdHJ1Y3R1cmUgZm91bmQgYW1vbmcgb2xkZXIgY2hpbGRyZW4gYW5kIGFkdWx0cywgd2Ugd291bGQgZGVzY3JpYmUgdGhpcyB0aHJlZS1mYWN0b3Igc3RydWN0dXJlIGFzIGJlaW5nIGZhaXJseSBzaW1pbGFyIHRvIHRoZSBhZHVsdC1saWtlIGNvbmNlcHR1YWwgc3RydWN0dXJl4oCUd2l0aCB0aGUgbm90YWJsZSBleGNlcHRpb24gdGhhdCBoYWxmIG9mIHRoZSBzb2NpYWwtZW1vdGlvbmFsIGFiaWxpdGllcyAoX2dldCBzYWRfLCBfaGF0ZSBzb21lb25lXywgYW5kIF9mZWVsIGhhcHB5XykgZGlkIG5vdCBsb2FkIG1vc3Qgc3Ryb25nbHkgb24gY2hpbGRyZW4ncyBvc3RlbnN0aXZlIF9IRUFSVFwqXyBmYWN0b3IuCgpgYGB7ciwgaW5jbHVkZSA9IFQsIGZpZy53aWR0aCA9IDgsIGZpZy5hc3AgPSAwLjR9CmZpZzA5X3Bsb3RzIDwtIHBsb3RfZ3JpZChlZmFfNF9wbG90X2QzXzQ2LCBlZmFfM19wbG90X2QzXzQ2LCBlZmFfM19wbG90X2QzX2FkLAogICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyA9IDEsIHJlbF93aWR0aHMgPSBjKDEsIDAuOCwgMSksIGxhYmVscyA9ICJBVVRPIikKZmlnMDlfd2l0aF9jYXB0aW9uIDwtIGFkZF9zdWIoZmlnMDlfcGxvdHMsIHN0cl93cmFwKCJGaWd1cmUgOTogRXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzIHJlc3VsdHMgZm9yIDQtIHRvIDYteWVhci1vbGQgY2hpbGRyZW4gKEEtQiksIGFuZCBhZHVsdHMgKEMpIGluIFN0dWR5IDMsIGluIHdoaWNoIGVhY2ggcGFydGljaXBhbnQgYXNzZXNzZWQgMTggbWVudGFsIGNhcGFjaXRpZXMgZm9yIGVhY2ggb2YgdHdvIHRhcmdldCBjaGFyYWN0ZXJzIChhIGJlZXRsZSBhbmQgYSByb2JvdCkuIEZvciB5b3VuZ2VyIGNoaWxkcmVuLCB3ZSBpbmNsdWRlIGJvdGggdGhlIGZvdXItZmFjdG9yIHNvbHV0aW9uIHN1Z2dlc3RlZCBieSBXZWlzbWFuIGV0IGFsLidzICgyMDE3KSBmYWN0b3IgcmV0ZW50aW9uIGNyaXRlcmlhIChBKSBhbmQgdGhlIHRocmVlLWZhY3RvciBzb2x1dGlvbiBzdWdnZXN0ZWQgYnkgcGFyYWxsZWwgYW5hbHlzaXMgKEIpLiIsIDE5MCksIHggPSAwLCBoanVzdCA9IDApCmdnZHJhdyhmaWcwOV93aXRoX2NhcHRpb24pCmBgYAoKIyMjIEF0dHJpYnV0aW9ucyBvZiBtZW50YWwgbGlmZQoKWFgKCiMjIyMgQ2hpbGRyZW4gdnMuIGFkdWx0cwoKWFgKCiMjIyMgQWdlIGRpZmZlcmVuY2VzIHdpdGhpbiB0aGUgY2hpbGQgc2FtcGxlCgpYWAoKIyMgRGlzY3Vzc2lvbgoKWFgKCiMgR2VuZXJhbCBEaXNjdXNzaW9uCgojIyBTdW1tYXJ5CgpUaGUgY3VycmVudCBzdHVkaWVzIHN1Z2dlc3QgdGhhdCBjaGlsZHJlbidzIGNvbmNlcHR1YWwgcmVwcmVzZW50YXRpb25zIG9mIG1lbnRhbCBsaWZlIHVuZGVyZ28gc3Vic3RhbnRpYWwgZGV2ZWxvcG1lbnQgYmV0d2VlbiB0aGUgYWdlcyBvZiA0LTkgeWVhcnPigJRpbiB0d28gZGlzdGluY3Qgc2Vuc2VzLiAKCkZpcnN0LCBhbmFseXNlcyBvZiB0aGUgY29ycmVsYXRpb25hbCBzdHJ1Y3R1cmUgb2YgY2hpbGRyZW4ncyBtZW50YWwgY2FwYWNpdHkgYXR0cmlidXRpb25zIChFRkFzKSBzdWdnZXN0ZWQgY2hhbmdlcyBpbiBjb25jZXB0dWFsIHN0cnVjdHVyZTogQmV0d2VlbiBlYXJseSBjaGlsZGhvb2QgKDQtNiB5ZWFyczsgU3R1ZGllcyAyLTMpIGFuZCBtaWRkbGUgY2hpbGRob29kICg3LTkgeWVhcnM7IFN0dWRpZXMgMS0yKSwgY2hpbGRyZW4ncyBzZW5zZSBvZiB3aGljaCBtZW50YWwgY2FwYWNpdGllcyAiZ28gdG9nZXRoZXIiIHNlZW1lZCB0byB1bmZvbGQgaW50byBhIGhpZ2hlci1kaW1lbnNpb25hbCBzcGFjZSwgY2hhcmFjdGVyaXplZCBieSBzdHJvbmdlciBkaWZmZXJlbnRpYXRpb24gb2YgdGhlIHNvY2lhbC1lbW90aW9uYWwgYWJpbGl0aWVzIHRoYXQgd2UndmUgY2FsbGVkICJoZWFydCIgZnJvbSB0aGUgcGh5c2lvbG9naWNhbCBzZW5zYXRpb25zIG9mIHRoZSBib2R5IGFuZCB0aGUgcGVyY2VwdHVhbC1jb2duaXRpdmUgYWJpbGl0aWVzIG9mIHRoZSBtaW5kLiAKTWVhbndoaWxlLCBhbmFseXNlcyBvZiBmYWN0b3Igc2NvcmVz4oCUc3VtbWFyaWVzIG9mIHdoaWNoIG1lbnRhbCBjYXBhY2l0aWVzIGNoaWxkcmVuIHRlbmRlZCB0byBhdHRyaWJ1dGUgdG8gd2hpY2ggdGFyZ2V0IGNoYXJhY3RlcnPigJRyZXZlYWxlZCBhIHNlY29uZCBraW5kIG9mIGFnZS1yZWxhdGVkIGRpZmZlcmVuY2U6IHdoYXQgd2UgbWlnaHQgY2FsbCBjaGFuZ2VzIGluIHRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgY29uY2VwdC4gVGhlc2UgZGlmZmVyZW5jZXMgd2VyZSBjbGVhcmVzdCBpbiBTdHVkaWVzIDEgYW5kIDMsIHdoaWNoIGZvY3VzZWQgb24gdHdvICJlZGdlIGNhc2VzIiBpbiBzb2NpYWwgcmVhc29uaW5nIChiZWV0bGVzIGFuZCByb2JvdHMpOiBCZXR3ZWVuIHRoZSBhZ2VzIG9mIDQtNiB5ZWFycyAoU3R1ZHkgMyksIFhYIEZJTEwgSU4sIHdoaWxlIGJldHdlZW4gdGhlIGFnZXMgb2YgNy05IHllYXJzIChTdHVkeSAxKSwgYXR0cmlidXRpb25zIG9mIGJvZHkgdG8gYmVldGxlcyBhbmQgcm9ib3RzIHdlcmUgcmVsYXRpdmVseSBzdGFibGUgYW5kIGFkdWx0LWxpa2UsIGF0dHJpYnV0aW9ucyBvZiBoZWFydCB0byB0aGVzZSAiZWRnZSBjYXNlcyIgc3RhcnRlZCBvdXQgaGlnaGVyIHRoYW4gYWR1bHRzIGFuZCBkZWNyZWFzZWQgdG8gbmVhcmx5IGFkdWx0LWxpa2UgbGV2ZWxzIGJ5IHRoZSBhZ2Ugb2YgOSB5ZWFycywgYW5kIGF0dHJpYnV0aW9ucyBvZiBtaW5kIHN0YXJ0ZWQgb3V0IGxvd2VyIHRoYW4gYWR1bHRzIGFuZCBpbmNyZWFzZWQgdG8gbmVhcmx5IGFkdWx0LWxpa2UgbGV2ZWxzIGJ5IHRoZSBhZ2Ugb2YgOSB5ZWFycy4KClhYIEdECg==